C++求数组中第k大的数,时间复杂度O(n)

方法一:先对数组进行排序,再得到第k的数,时间复杂度为n*logn

方法二:将数组存在map中,再求中位数,因为map内部是红黑树,时间复杂度应该也是n*logn
#include<iostream>
#include<map>
#include<vector>
#include<set>
using namespace std;
int main() {
    map<int, int> myMap;
    int n,k;
    cin >> n>>k;
    vector<int> myVector(n);
    for (int i = 0; i < n; i++) {
        cin >> myVector[i];
        myMap[myVector[i]]++;
    }    
    int sum=0;
    for (auto iter = myMap.begin(); iter != myMap.end(); iter++) {
        sum += (*iter).second;
        if (sum >= k) {
            cout << (*iter).first;
            break;
        }
    }
    int t;
    cin >> t;
    return 0;
}

方法3:结合快速排序,每一次求出一个元素位置,直到找到第k个元素。时间复杂度介于O(n)~O(n*logn)之间,可以认为是O(n)

//寻找第k大的数
#include<iostream>
#include<map>
#include<vector>
#include<set>
using namespace std;
//使用快速排序,时间复杂度介于n到n*logn之间,可以认为时间复杂度为n
int n, k;
int myArray[100];
int DFSfork(int l, int r, int k) {
    int low = l;
    int high = r;
    int index = l;
    int order = -1;
    while (l < r) {
        if (order == -1) {
            if (myArray[r] >= myArray[index]) {
                r--;
            }
            else {
                int t = myArray[index];
                myArray[index] = myArray[r];
                myArray[r] = t;
                index = r;
                l++;
                order = 1;
            }
        }
        else if (order == 1) {
            if (myArray[l] <= myArray[index]) {
                l++;
            }
            else {
                int t = myArray[index];
                myArray[index] = myArray[l];
                myArray[l] = t;
                index = l;
                r--;
                order = -1;
            }
        }
    }
        if (index == (k - 1)) {
            return myArray[index];
        }
        else if (index > (k - 1)) {
            return DFSfork(low, index - 1, k);
        }
        else {
            return DFSfork(index+1, high, k);
        }
}
int main() {
    cin >> n >> k;
    for (int i = 0; i < n; i++) {
        cin >> myArray[i];
    }
    int tt = DFSfork(0, n - 1, k);
    cout << tt;
    return 0;
}

发布了10 篇原创文章 · 获赞 3 · 访问量 297

猜你喜欢

转载自blog.csdn.net/qq_32227619/article/details/105572565