快速排序的三种方法
填坑
#include <iostream>
#include <ctime>
using namespace std;
const int SZ = 30;
int a[SZ];
void qst(int L, int R) {
if (L < R) {
int pivot = a[L]; // 以左侧第一个为基数
cout << pivot << endl;
int tL = L; //
int tR = R; //
while (tL < tR) {
while ((a[tR] >= pivot) && (tL < tR)) --tR; // 先找到右侧第一个比基数小的数
a[tL] = a[tR]; // 将右侧第一个大数填入左侧
while ((a[tL] <= pivot) && (tL < tR)) ++tL; // 在左侧找到一个比基数大的数
a[tR] = a[tL]; // 将左侧的数填入右侧
}
a[tL] = pivot; // 完成后将基数填入最后左右重叠的位置
qst(L, tL - 1); // 递归左侧排序
qst(tL + 1, R); // 递归右侧排序
}
}
int main() {
srand(time(0));
cout << endl;
for (size_t i = 0; i < SZ; i++) a[i] = rand() % 100;
for (size_t i = 0; i < SZ; i++) cout << a[i] << ' ';
cout << endl;
qst(0, SZ - 1); // 对全部元素进行排序
for (size_t i = 0; i < SZ; i++) cout << a[i] << ' ';
cout << endl << endl;
}
左右交换
// 左右交换法
void qst_1(int L, int R) {
if (L < R) {
int pivot = a[L]; // 以左侧第一个为基数
cout << pivot << endl;
int tL = L + 1; // 从左边第二个元素开始
int tR = R; //
while (tL < tR) {
// 此处的 a[tR] >= pivot条件 可采用stl中sort函数类似的传入比较函数的方法
while ((a[tR] >= pivot) && (tL < tR)) --tR; // 在右侧第一个比基数小的数
while ((a[tL] <= pivot) && (tL < tR)) ++tL; // 在左侧找到一个比基数大的数
if (tL < tR) swap(a[tR], a[tL]); // 交换左右两个值
}
if (a[L] > a[tL]) swap(a[L], a[tL]); // 将第一个元素和中间位置进行交换
qst_1(L, tL - 1); // 递归左侧排序
qst_1(tL, R); // 递归右侧排序
}
}
游标追逐
// 游标追逐
void qst_2(int L, int R) {
if (L < R) {
int pivot = a[L]; // 以左侧第一个为基数
cout << pivot << endl;
int tL = L + 1; // 从左边第二个元素开始
int tR = L + 1; // 右侧下标也从第二个开始
do {
if (tR < R) ++tR; // 向右移动右侧游标
while (tL < tR) {
if (a[tL] > a[tR]) swap(a[tR], a[tL]); // 如果满足左侧大于右侧则交换
++tL; // 向右移动左侧游标
}
} while (tR < R);
if (a[L] > a[tL])
swap(a[L], a[tL]); // 将第一个元素和中间位置进行交换
qst_2(L, tL - 1); // 递归左侧排序
qst_2(tL, R); // 递归右侧排序
}
}