找出第k大的數字(快排實現+堆排實現)

複習下一些基本算法

#include<bits/stdc++.h>

using namespace std;

int quick_sort(vector<int> &v, int l, int r, int k){
    if(l<r){
        int target = v[l];
        int tmp_l = l, tmp_r = r;
        while(tmp_l < tmp_r){
            while(tmp_l < tmp_r && v[tmp_r] >= target) tmp_r--;
            if(tmp_l < tmp_r) v[tmp_l++] = v[tmp_r];
            while(tmp_l < tmp_r && v[tmp_l] < target) tmp_l++;
            if(tmp_l < tmp_r) v[tmp_r--] = v[tmp_l];
        }
        v[tmp_l]=target;
        //cout << tmp_l << " " << v[tmp_l] << endl;
        if(tmp_l == k) return v[tmp_l];
        else if(tmp_l > k) return quick_sort(v, l, tmp_l-1, k);
        else return quick_sort(v, tmp_l+1, r, k);
    }
}

int main()
{
    priority_queue<int, vector<int> , greater<int> > pq;
    vector<int> v;
    string str;
    cin >> str;
    stringstream ss;
    ss.str(str);
    char ch;
    ss >> ch;
    int k = 3;
    while(!ss.eof()){
        int num;
        ss >> num;
        v.push_back(num);
        ss >> ch;
        if(ch == ']') break;
    }
    //堆排序
    /*for(int i=0; i < v.size(); i++){
        pq.push(v[i]);
        while(pq.size()>k){
            //cout << pq.top() << endl;
            pq.pop();
        }
    }
    cout << pq.top() << endl;*/
    
    //快排
    cout << quick_sort(v, 0, v.size()-1, v.size()-k) << endl;
}
輸入:[1,2,3,4,5]
輸出:3

輸入:[1,1,2,2,3]
輸出:2

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