voidSwap(int *a, int *b) { int c = *a; *a = *b; *b = c; }
voidShow(int *arr, int len) { for (int i = 0; i < len; ++i) { printf("%d ", arr[i]); }
printf("\n"); }
// 冒泡 // O(n^2) O(1) 稳定 voidBubbleSort(int *arr, int len) { for (int i = 0; i < len - 1; ++i) { int flag = 0; for (int j = 0; j < len - 1 - i; ++j) { if (arr[j] > arr[j + 1]) { Swap(&arr[j], &arr[j + 1]); flag = 1; } }
if (flag == 0) { break; } } }
// 选择 // O(n^2) O(1) 不稳定 voidSelectSort(int *arr, int len) { for (int i = 0; i < len - 1; ++i) { int min = i; for (int j = i + 1; j < len; ++j) { if (arr[j] < arr[min]) { min = j; } }
Swap(&arr[i], &arr[min]); } }
//直接插入排序 数据越趋于有序,其效率越高 // O(n^2) O(1) 稳定 // 最坏 O(n^2) 最好 O(n) voidInsertSort(int *arr, int len) { for (int i = 1; i < len; ++i) { int tmp = arr[i]; int j = 0; for (j = i - 1; j >= 0; --j) { if (arr[j] > tmp) { arr[j + 1] = arr[j]; } else { break; } }
arr[j + 1] = tmp; } }
staticvoidShell2(int *arr, int len, int d) { for (int k = 0; k < d; ++k) { for (int i = d + k; i < len; i += d) { int tmp = arr[i]; int j = i - d; for (; j >= 0; j -= d) { if (arr[j] > tmp) { arr[j + d] = arr[j]; } else { break; } }
arr[j + d] = tmp; } } } staticvoidShell(int *arr, int len, int d) { for (int i = d; i < len; ++i) { int tmp = arr[i]; int j = i - d; for (; j >= 0; j -= d) { if (arr[j] > tmp) { arr[j + d] = arr[j]; } else { break; } }
arr[j + d] = tmp; } }
//希尔排序 // O(n ^1.3~1.5) O(1) 不稳定 voidShellSort(int *arr, int len) { // 目前并没有一个合适的固定分组 // 分组的值需要两两互质,并且最后一个分组必须为1 int d[] = { 5, 3, 1 }; for (int i = 0; i < sizeof(d) / sizeof(d[0]); ++i) { Shell(arr, len, d[i]); } }
// O(logn) staticvoidOneAdjust(int *arr, int len, int root) { int i = root; int tmp = arr[i]; int j = 2 * i + 1; // left while (j < len) { if (j + 1 < len && arr[j] < arr[j + 1]) { j = j + 1; } // j 就是左右孩子中较大的哪一个 if (arr[j] > tmp) { arr[i] = arr[j]; i = j; // 下一个子树的根 j = 2 * i + 1; // 下一个子树的左孩子 } else { break; } }
arr[i] = tmp; }
// O(nlogn) staticvoidCreateHeap(int *arr, int len) { int root = len / 2 - 1; for (; root >= 0; --root) { OneAdjust(arr, len, root); // O(logn) } }
while (st.top != 0) { right = st.data[--st.top]; left = st.data[--st.top];
int mod = OneQuick(arr, left, right);
if (mod - left > 1) { st.data[st.top++] = left; st.data[st.top++] = mod - 1; } if (right - mod > 1) { st.data[st.top++] = mod + 1; st.data[st.top++] = right; } }
free(st.data); }
//快速排序 voidQuickSort(int *arr, int len) { ForQuick(arr, 0, len - 1); }
// O(n) staticvoidMeger(int *arr, int len, int width, int *brr) { int L1 = 0; int H1 = L1 + width - 1; int L2 = H1 + 1; int H2 = L2 + width - 1 < len - 1 ? L2 + width - 1 : len - 1; int num = 0;
while (L1 < len && L2 < len) { while (L1 <= H1 && L2 <= H2) { if (arr[L1] < arr[L2]) { brr[num++] = arr[L1++]; } else { brr[num++] = arr[L2++]; } }