寻找数组的第k个最大者

来源:互联网 发布:bamboo mac 手绘 编辑:程序博客网 时间:2024/06/04 20:02

 使用了两种解法:

  1. 将全部元素从大到小排序,然后返回第k-1位置的元素
  2. 选取前k个元素进行排序,然后将剩余的元素插入到对应位置,没插入一次,抛弃最后一个元素,最后返回最后位置的元素

 代码如下:

#include <iostream>#include <vector>using namespace std;void bubble_sort(vector<int> &iv);inline void swap(int &a, int &b);void print_vector(vector<int> &v);//sort all elements,and select kthint select_k_max_v1(vector<int> &v, int k);//select k ahead elements as a vector and sort it, and insert remain elements one by oneint select_k_max_v2(vector<int> &v, int k);//return the index of val in  sorted v after val inserted itint find_right_position(vector<int> &v, int val);void move_back_one(vector<int> &v, int idx);int main(int argc, char* argv[]){    int a[] = {23, 53, 34, 22, -23, 54};    vector<int> ivec(a, a + sizeof(a) / sizeof(int));    cout << "The vector is:" << endl;    print_vector(ivec);    cout << endl;    bubble_sort(ivec);    cout << "After sorted,the vector is:" << endl;    print_vector(ivec);    cout << endl;    int k = 4;    cout << "The " << k << "th max num in vector is " << select_k_max_v1(ivec,k)<< endl;    cout << "The " << k << "th max num in vector is " << select_k_max_v2(ivec,k)<< endl;    return 0;}void bubble_sort(vector<int> &iv){    bool sorted = false;    while(!sorted)    {        sorted = true;        for(int i = iv.size(); i > 0; --i)        {            for(int j = 1; j < i; ++j)            {                if(iv[j - 1] < iv[j])                {                    swap(iv[j - 1], iv[j]);                    sorted = false;                }               }        }    }}void swap(int &a, int &b){    int tmp = a;    a = b;    b = tmp;}void print_vector(vector<int> &v){    for(const int elem : v)        cout << elem << " ";}int select_k_max_v1(vector<int> &v, int k){    vector<int> tmp_vec(v);    bubble_sort(tmp_vec);    return tmp_vec[k - 1];}int select_k_max_v2(vector<int> &v, int k){    vector<int> tmp_vec(k);    for(int i = 0; i < k; ++i)        tmp_vec[i] = v[i];    for(unsigned int j = k; j < v.size(); ++j)    {        int idx = find_right_position(tmp_vec, v[j]);        if(idx < k)        {            move_back_one(tmp_vec, idx);            tmp_vec[idx] = v[j];        }    }    return tmp_vec[k - 1];}int find_right_position(vector<int> &v, int val){    int idx = v.size() - 1;    for(; idx >= 0; --idx)    {           if(val <= v[idx])            break;    }    return idx + 1;}void move_back_one(vector<int> &v, int idx){    for(int i = v.size() - 1; i > idx; --i)        v[i] = v[i - 1];}