voidquick_sort(int *a, int l, int r) { if (l >= r) return; int x = a[l]; // 取最左边的值作为主元x int i = l, j = r; while (i < j) { while (a[i] <= x && i<r) ++i; // 循环结束时a[i]比x大 while (a[j] >= x && j>l) --j; // 循环结束时a[j]比x小 if (i < j) swap(a[i], a[j]); // 交换a[i],a[j] } // j为分界点 swap(a[l], a[j]); // 将主元x放在正确的位置,作为分界点
voidquick_sort(int *a, int l, int r) { if (l >= r) return; int k = rand() % (r - l + 1) + l; // 产生l到r的随机数 // 从a[l]到a[r]中随机选取 swap(a[l], a[k]); int x = a[l]; int i = l, j = r; while (i < j) { while (a[i] <= x && i<r) ++i; // 循环结束时a[i]比x大 while (a[j] >= x && j>l) --j; // 循环结束时a[j]比x小 if (i < j) swap(a[i], a[j]); // 交换a[i],a[j] } // j为分界点 swap(a[l], a[j]); // 将主元x放在正确的位置,作为分界点
voidquick_sort(int *a, int l, int r) { if (l >= r) return; swap(a[l], a[Getmid(a, l, r)]); // 三数取中 int x = a[l]; int i = l, j = r; while (i < j) { while (a[i] <= x && i<r) ++i; // 循环结束时a[i]比x大 while (a[j] >= x && j>l) --j; // 循环结束时a[j]比x小 if (i < j) swap(a[i], a[j]); // 交换a[i],a[j] } // j为分界点 swap(a[l], a[j]); // 将主元x放在正确的位置,作为分界点
voidInsert_sort(int *a, int l, int r) { for (int i = l + 1; i < r; ++i) { if (a[i] < a[i - 1]) { int j = i, k = a[i]; while (a[i]<a[--j] && j>l); int tmp = j; while (j < i) { a[j + 1] = a[j]; ++j; } a[tmp] = k; } } } voidquick_sort(int *a, int l, int r) { if (r - l < 16) // 在子区间的长度小于16时,进行插入排序,减小递归的栈深度 Insert_sort(a, l, r); int x = a[l]; // 取最左边的值作为主元x int i = l, j = r; while (i < j) { while (a[i] <= x && i<r) ++i; // 循环结束时a[i]比x大 while (a[j] >= x && j>l) --j; // 循环结束时a[j]比x小 if (i < j) swap(a[i], a[j]); // 交换a[i],a[j] } // j为分界点 swap(a[l], a[j]); // 将主元x放在正确的位置,作为分界点