快速选择问题

输入n个整数和一个正整数k(1<=k<=n),输出这k[n]。

快速排序

将序列分成两部分,大于tmp小于tmp

分别对两部分进行排序

不要合并

void QuickSort(RecType R[],int s,int t,int k)
{
    int i=s,j=t;
    RecType tmp;
    if(s<t)
    {
        tmp=R[s];
        while(i!=j)
        {
            while(j>i&&R[j].key>=tmp.key)
                j--;
            R[i]=R[j];
            while(i<j&&R[i].key<=tmp.key)
                i++;
            R[j]=R[i];
        }
        R[i]=tmp;
        QuickSort(R,i+1,t,k);
        QuickSort(R,s,i-1,k);
    }
}
//代码来自数据结构-李春葆

O(n)的时间内将k[n]找出来

#include<iostream>
using namespace std;
struct RecType
{
    int key;
};
int rk;
void QuickSort(RecType R[],int s,int t,int k)
{
    int i=s,j=t;
    RecType tmp;
    if(s<t)
    {
        tmp=R[s];
        while(i!=j)
        {
            while(j>i&&R[j].key>=tmp.key)
                j--;
            R[i]=R[j];
            while(i<j&&R[i].key<=tmp.key)
                i++;
            R[j]=R[i];
        }
        R[i]=tmp;
        if(k>i)
            QuickSort(R,i+1,t,k);
        else if(k<i)
            QuickSort(R,s,i-1,k);
        else
            rk=R[k].key;
    }
    rk=R[k].key;
}
int main()
{
    int s=1,t,k;
    RecType r[100];
    cin>>t>>k;
    for(int i=1;i<=t;i++)
        cin>>r[i].key;
    QuickSort(r,s,t,k);
    cout<<rk<<endl;
}

 

posted @ 2018-08-13 20:30  ke_yi  阅读(127)  评论(0编辑  收藏  举报