快速排序的三种方法

快速排序的三种方法

填坑

#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); // 递归右侧排序
    }
}
posted @ 2023-11-05 22:22  iamy  阅读(43)  评论(0)    收藏  举报