冒泡排序:
从第一个数开始,和后一位对比,大的数后移。
public static void bubbleSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int end = arr.length - 1; end > 0; end--) { //大的数冒泡到末尾之后,固定这个最大数,把end前移
for (int i = 0; i < end; i++) { //不会越界,i只到end-1,但会与end下标的值对比
if (arr[i] > arr[i + 1]) {
swap(arr, i, i + 1);
}
}
}
}
选择排序:
i到n遍历选最小值放下标i位置。
例:
0到所有选一最小值,放0位置,
1到所有,选最小值,放1位置
……
public static void selectionSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i; //每轮的最小值都不同,因此在此定义
for (int j = i + 1; j < arr.length; j++) {
minIndex = arr[j] < arr[minIndex] ? j : minIndex;
}
swap(arr, i, minIndex); //最小值放入下标为i的位置
}
}
插入排序:
类似扑克牌等牌插入,假设插入的是第i个牌,有arr.length-1个待插入
public static void insertionSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int i = 1; i < arr.length; i++) {
for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) { //j是i前一个数,j与j+1比较,下标往前挪,逐个向前比较,直到j<0
swap(arr, j, j + 1);
}
}
}
希尔排序:
初始增量为length/2,缩小增量继续以gap=gap/2的方式,进行分组,每组使用直接插入排序,随着增量减少,每组元素越多,增量为1时,这个数组为一组,算法结束。
void shell_sort(int *data, int length) {
int gap = 0;
int i = 0, j = 0;
int temp;
for (gap = length / 2;gap >= 1; gap /= 2) {
for (i = gap;i < length;i ++) {
temp = data[i];
for (j = i-gap;j >= 0 && temp < data[j];j = j - gap) {
data[j+gap] = data[j];
}
data[j+gap] = temp;
}
}
}
归并排序:
base case:划分至最小规模,就不用再划分
public static void mergeSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
mergeSort(arr, 0, arr.length - 1);
}
public static void mergeSort(int[] arr, int l, int r) {
if (l == r) {
return;
}
int mid = l + ((r - l) >> 1);
mergeSort(arr, l, mid);
mergeSort(arr, mid + 1, r);
merge(arr, l, mid, r);
}
public static void merge(int[] arr, int l, int m, int r) { //外排:归并排序;
int[] help = new int[r - l + 1];
int i = 0;
int p1 = l;
int p2 = m + 1;
while (p1 <= m && p2 <= r) {
help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++]; //都不越界时,最小数存help里,指针再加1;
}
while (p1 <= m) {
help[i++] = arr[p1++]; //p2越界,p1存入help;
}
while (p2 <= r) {
help[i++] = arr[p2++];
}
for (i = 0; i < help.length; i++) {
arr[l + i] = help[i]; //按顺序存回数组中;
}
}