快排+rand


#include <vector>
#include <iostream>
#include <cassert>
#include <queue>
#include <algorithm>
using namespace std;

//找到l-r里的一个随机元素,并和nums[r]替换
//返回大于nums[r]的元素下标
int rand_pos(vector<int> &nums,int l,int r) {
    int len = r-l+1;
    int rand_pos = l + (rand() % (len));
    swap(nums[rand_pos],nums[r]);
    return 0;
}
//把[l,r]里面小于nums[r]的元素放在前面
//返回大于nums[r]的元素下标
int partition(vector<int> &nums,int l,int r) {
    int x = nums[r];
    int j = l-1;
    for(int i=l;i<r;i++) {
        if(nums[i] <= x) {
            swap(nums[++j],nums[i]);
        }
    }
    swap(nums[j+1],nums[r]);
    return j+1;
}
//在[l,r]中找到第index小的数
int quickSelect(vector<int> &nums,int l,int r) {

    rand_pos(nums,l,r);
    int pos = partition(nums,l,r);
    if(pos - 1 > l) {
        quickSelect(nums,l,pos-1);
    }

    if(pos + 1 < r) {
        quickSelect(nums, pos + 1, r);
    }

    return 0;
}

int quickSort(vector<int>& nums) {
    srand(time(0));
    int n = nums.size();
    int ans = quickSelect(nums,0,n-1);
    return ans;
}


int main(){
    vector<int>v = {5,4,3,2,1};
    quickSort(v);
    for(auto i:v) {
        cout << i << " ";
    }
    return 0;
}

posted @ 2021-12-17 16:02  hh13579  阅读(23)  评论(0编辑  收藏  举报