intpartition(int nums[], int left, int right){ int i = left, j = right - 1; int mid = (left + right) >> 1; // 偷懒直接取中点 swap(nums[i], nums[mid]); int pivot = nums[i]; while (i < j) { while (i < j && pivot <= nums[j]) j--; nums[i] = nums[j]; while (i < j && nums[i] <= pivot) i++; nums[j] = nums[i]; } nums[i] = pivot; return i; }
DUP版
DUP版克服了LUG版的问题,但是增加了交换的次数。
DUP版的特点是:
勤于交换
懒于拓展
intpartition(int nums[], int left, int right){ // 可以应对所有元素全部相等的退化情况 int i = left, j = right - 1; int mid = (left + right) >> 1; // 偷懒直接取中点 swap(nums[i], nums[mid]); int pivot = nums[i]; while (i < j) { while (i < j && pivot < nums[j]) j--; if (i < j) nums[i++] = nums[j]; while (i < j && nums[i] < pivot) i++; if (i < j) nums[j--] = nums[i]; } nums[i] = pivot; return i; }
LGU版
此版本与LUG版一样,在存在大量元素重复时,也属于最坏情况,复杂度为。
intpartitionLGU(int nums[], int left, int right){ swap(nums[left], nums[(left + right) >> 1]); // 偷懒直接取中点 int pivot = nums[left]; int mid = left; for (int k = left + 1; k < right; k++) { if (nums[k] < pivot) swap(nums[++mid], nums[k]); }
swap(nums[left], nums[mid]);
return mid; }
quick_sort()
实现了partition算法之后,quick_sort()函数的实现就不难了。
voidquick_sort(int nums[], int left, int right){ if (right - left <= 1) return; int mid = partitionLGU(nums, left, right); quick_sort(nums, left, mid); quick_sort(nums, mid + 1, right); }