C++快速排序的簡單實現(包含兩種基準值取值方法)

提供了兩種基準值的取值方法:

1. 隨機選取元素作爲基準值

2. 區間的左中右三端三個數,取其中值作爲基準值

 

代碼如下:

#include <iostream>
#include <random>
#include <vector>
#include <ctime>
#include <cstdlib>

#define NUM 10

using namespace std;


void quickSort(vector<int>& nums, int lo, int hi) {
    if(lo >= hi) return;
    int left = lo, right = hi;

//    //隨機選取元素作爲基準值
//    srand(time(NULL));
//    int idx = rand() % (hi - lo) + lo;
//    swap(nums[left], nums[idx]);
//    int tmp = nums[left];

    //left, right, mid 三數取中間值作爲基準值
    int mid = (left + right) >> 1;
    if(nums[left]<nums[mid]) swap(nums[left], nums[mid]);
    if(nums[right]<nums[mid]) swap(nums[right], nums[mid]);
    if(nums[left]>nums[right]) swap(nums[left], nums[right]);
    int tmp = nums[left];

    while(lo < hi) {
        while(hi > lo && nums[hi] >= tmp) hi--;
        nums[lo] = nums[hi];
        while(hi > lo && nums[lo] < tmp) lo++;
        nums[hi] = nums[lo];
    }

    nums[lo] = tmp;
    quickSort(nums, left, lo - 1);
    quickSort(nums, lo + 1, right);
}


int main() {
    auto t1=clock();
    vector<int> nums(NUM);  // 10 65 8 3 5 7 5 11 6 33
    for(auto& num : nums) cin >> num;

    //遞歸實現
    quickSort(nums, 0, nums.size() - 1);
    cout << "time cost :  " << clock()-t1 << " ms" << endl;

    //非遞歸實現待補充

    for(auto num : nums) cout << num << " ";
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章