算法实现
间接插入排序
public static void insertSort() {for (int i = 1; i < array.length; i++) {int tempdata = array[i];
int j;
for (j = i - 1; j >= 0; j--) {if (array[j] > tempdata) {array[j + 1] = array[j];
} else {break;}
}
array[j + 1] = tempdata;
}
}
希尔排序
public static void shellSort() {
int d = array.length;
while (true) {
d = d / 2;
for (int x = 0; x < d; x++) {for (int i = x + d; i < array.length; i = i + d) {int temp = array[i];
int j;
for (j = i - d; j >= 0 && array[j] > temp; j = j - d) {array[j + d] = array[j];
}
array[j + d] = temp;
}
}
if (d == 1) {break;}
}
}
冒泡排序
public static void bubbleSort() {
int temp;
int size = array.length;
for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - 1 - i; j++) {if (array[j] > array[j + 1]) // 替换两数地位
{temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
简略抉择排序
public static void simpleChooseSort() {
// 数组长度
int len = array.length;
for (int i = 0; i < len; i++) {
// 记录以后地位
int position = i;
// 找出最小的数,并用 position 指向最小数的地位
for (int j = i + 1; j < len; j++) {if (array[position] > (array[j])) {position = j;}//endif
}//endfor
// 替换最小数 array[position] 和第 i 位数的地位
int temp = array[i];
array[i] = array[position];
array[position] = temp;
}//endfor
}
疾速排序
public static void quickSort(int[] array, int start, int end) {if (start < end) {int baseNum = array[start];// 选基准值
int midNum;// 记录两头值
int i = start;
int j = end;
do {while ((array[i] < baseNum) && i < end) {i++;}
while ((array[j] > baseNum) && j > start) {j--;}
if (i <= j) {midNum = array[i];
array[i] = array[j];
array[j] = midNum;
i++;
j--;
}
} while (i <= j);
if (start < j) {quickSort(array, start, j);
}
if (end > i) {quickSort(array, i, end);
}
}
}
归并排序
static class MergSort {private static void merge(int[] a, int low, int mid, int high) {int[] temp = new int[high - low + 1];
int i = low;// 左指针
int j = mid + 1;// 右指针
int k = 0;
// 把较小的数先移到新数组中
while (i <= mid && j <= high) {if (a[i] < a[j]) {temp[k++] = a[i++];
} else {temp[k++] = a[j++];
}
}
// 把右边残余的数移入数组
while (i <= mid) {temp[k++] = a[i++];
}
// 把左边边残余的数移入数组
while (j <= high) {temp[k++] = a[j++];
}
// 把新数组中的数笼罩 nums 数组
for (int k2 = 0; k2 < temp.length; k2++) {a[k2 + low] = temp[k2];
}
}
public static void mergeSort(int[] a, int low, int high) {int mid = (low + high) / 2;
if (low < high) {
// 右边
mergeSort(a, low, mid);
// 左边
mergeSort(a, mid + 1, high);
// 左右归并
merge(a, low, mid, high);
}
}
}
算法抉择
1. 数据规模较小
- 待排序列根本有序的状况下,能够抉择间接插入排序;
- 对稳定性不作要求宜用简略抉择排序,对稳定性有要求宜用插入或冒泡。
2. 数据规模不是很大
- 齐全能够用内存空间,序列杂乱无序,对稳定性没有要求,疾速排序,此时要付出 log(N)的额定空间;
- 序列自身可能有序,对稳定性有要求,空间容许下,宜用归并排序。
3. 数据规模很大
- 对稳定性有求,则可思考归并排序;
- 对稳定性没要求,宜用堆排序。
4. 序列初始根本有序(正序),宜用直接插入,冒泡
总结比拟