第k小的元素

利用快排思想,如果标志位大于k,则第k小的数字在左边,否则在右边。(程序是第k大的元素)

#include <iostream>
#include <vector>
using namespace std;

//求向量中第k大的数字,从大到小进行排列

int q_sort(vector<int> &v, int low, int high)
{
    int tmp = v[low];
    
    while (low < high)
    {
        while (low<high && v[high] <= tmp)
            --high;
        v[low] = v[high];

        while (low<high && v[low] >= tmp)
            ++low;
        v[high] = v[low];    
    }
    v[low] = tmp;
    cout << low << endl;
    for (auto &i : v)
        cout << i << " ";
    cout << endl;
    return low;
}
int k_max(vector<int> &v, int low, int high,int k)
{
    if (low >= high)
        return v[low];
    else 
    {
        int mid = q_sort(v, low, high);
        if (mid>k)
            k_max(v, low, mid - 1,k);
        else if (mid < k)
            k_max(v, mid + 1, high,k);
        else
            return v[mid];
    }

}

int main()
{
    vector<int> v = { 78, 23, 64, 1, 35, 98, 45, 61, 32, 845, 223 };
    int len = v.size();
    int k_num=k_max(v, 0, len - 1, 3-1);    //此处为k-1,从大到小的排列,下标为k-1的数。
    cout << k_num << endl;
    return 0;
}

 

posted @ 2018-06-19 16:45  东风知我欲山行  阅读(219)  评论(0编辑  收藏  举报