步骤
步骤 | 操作 | 描述 |
---|---|---|
1 | 选择基准值 | 从数组中选择一个元素作为基准值(例如,最后一个元素) |
2 | 初始化指针 | 设置两个指针,一个指向基准值的左侧,另一个指向右侧 |
3 | 遍历和比较 | 从左向右遍历,找到第一个大于基准值的元素,并从右向左找到第一个小于基准值的元素 |
4 | 交换元素 | 交换这两个找到的元素 |
5 | 移动基准值 | 将基准值与右侧指针所指的元素交换位置 |
6 | 重复步骤3-5 | 继续重复步骤3-5,直到左右指针相遇 |
7 | 递归排序 | 对基准值左侧和右侧的子数组递归执行快速排序 |
举例
假设当前的待排序的序列为 R[low,hight] , 其中 low<=hight。同时选取首元素为基准元素。
步骤一:选取首元素的第一个元素作为基准元素 pivot=R[low] ,i=low ,j=hight。
步骤二:从右向左扫描,找到小于等于 pivot 的数,如果找到,R[i] 和 R[j] 交换 ,i++。
步骤三:从左向右扫描,找到大于 pivot 的数,如果找到,R[i] 和 R[j] 交换,j--。
步骤四:重复 步骤二~步骤三,直到 j 与 i 的指针重合 返回位置 mid=i ,该位置的数正好是 pivot 元素。
至此换成一趟排序,此时以 mid 为界线,将数据分割为两个子序列,左侧子序列都比 pivot 数小,右侧子序列都比 pivot 数大,然后再分别对这两个子序列进行快速排序。
代码
#include <bits/stdc++.h>
using namespace std;
int a[1000];
int part(int low, int high) {
int i = low, j = high, pivot = a[low];
while (i < j) {
while (i < j && a[j] > pivot) { // 从右往左找,找到一个比基准小于等于的数
j--;
}
if (i < j) {
swap(a[i++], a[j]);
}
while (i < j && a[i] < pivot) { //从左忘右边走,找到一个比基准大的数
i++;
}
if (i < j) {
swap(a[i], a[j--]);
}
}
return i;
}
void quicksort(int low, int high) {
int mid;
if (low < high) {
mid = part(low, high); // 返回基准元素的位置
quicksort(low, mid - 1);
quicksort(mid + 1, high);
}
}
int main() {
int n;
cout << "请输入个数:";
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
quicksort(0, n - 1);
cout << "排序后:" << endl;
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << endl;
return 0;
}