# 定义 pivot 函数,他会以数组第一个数作为参考数,并会按上述规则调整数组,并返回参考数的下标 defpivot(a): # 首先我们分析一下边界情况,首先如果只有一个数,这种情况下数组已经是有序的了,我们返回 -1 代表不需要再继续后面的过程。那如果是两个数的话,我们可以直接比较大小然后给出正确排序,也不需要 pivot 过程了。我们仍然返回 -1。 iflen(a) == 1:return -1 iflen(a) == 2: if a[0] > a[1]: a[0],a[1] = a[1],a[0] return -1 # 那么接下来我们就得进行我们的算法了,首先按我们刚才说的,我们假设参考数是第一个值。同时我们定义两个指针,i 指向 1,j 指向末尾。 pivot = a[0] i = 1; j = len(a)-1 # 如果 i 和 j 还没重叠的话 while i < j: # 我们比较 a[i] 和 pivot 的大小关系,直到碰到第一个 a[i] 大于 pivot,或者 i 等于 j 就退出 while a[i] < pivot and i < j: i += 1 # 对 a[j] 进行类似操作 while a[j] > pivot and i < j: j -= 1 # 如果 i, j 重合,就可以退出了 if i == j:break # 交换 a[i], a[j] 继续算法 a[i],a[j] = a[j],a[i] # 最后交换 pivot if a[i] > a[0]: a[0],a[i-1] = a[i-1],a[0]; i -=1 else: a[0],a[i] = a[i],a[0] return i
// 完整的快排算法 就是对其进行左右递归. 下面的是严蔚敏的快速排序算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
intPartition(vector<int>& nums, int low, int high){ int pivot = nums[low]; while (low < high) { while (low < high and nums[high] >= pivot) --high; nums[low] = nums[high]; while (low < high and nums[low] <= pivot) ++low; nums[high] = nums[low]; } nums[low] = pivot; return low; }
voidQuickSort(vector<int>& nums, int low, int high){ if (low < high) { int pivot = Partition(nums, low, high); QuickSort(nums, low, pivot - 1); QuickSort(nums, pivot + 1, high); } }