简单总结:
快速排序 =
划分
+ 递归
排序过程图示:
枢轴元素:
通常选择顺序表第一个元素,用于划分顺序表为两部分,左边部分值小于枢轴,右边部分值大于枢轴
算法步骤:
- 确定枢轴
pivot
,并用一个新变量存储:int pivot = A[low]
- high: 依次从后往前扫描,如果
元素值 A[high] < pivot
,则A[low] = A[high]
,否则high--
- low: 依次从前往后扫描,如果
元素值 A[low] > pivot
,则A[high] = A[low]
,否则low++
算法实现
int Partition(int A[], int low, int high) {
int pivot = A[low];
while (low < high) {
while (low < high && A[high] >= pivot) {
high--;
}
A[low] = A[high]; // 比枢轴元素小的元素移动到左端
while (low < high && A[low] <= pivot) {
low++;
}
A[high] = A[low]; // 比枢轴元素大的元素移动到右端
}
A[low] = pivot; // 枢轴元素放到最终位置
return low; // 枢轴元素的最终位置,左边元素小于枢轴元素,右边元素大于枢轴元素
}
void QuickSort(int A[], int low, int high) {
if (low < high) {
int pivotPos = Partition(A, low, high); // 进行一次划分
QuickSort(A, low, pivotPos - 1); // 递归划分左边部分
QuickSort(A, pivotPos + 1, high); // 递归划分右边部分
}
}
最坏情况