qsort()函数及第k小的数

来源:互联网 发布:增值税批量开票软件 编辑:程序博客网 时间:2024/05/16 11:18
下面是自己写的快排函数,测试了几组数据,没有出现错误,现将代码贴上:
void Qsort(int *a,int l,int r){    if(l>=r)        return ;    int mid=(r+l)/2;    int temp=a[mid];    int i=l;    int j=r;    while(i<j)    {        while(a[i]<temp)    i++;        while(a[j]>temp)    j--;        if(i<j && a[i]==a[j])  j--;        else if(i<j)            swap(a[i],a[j]);    }    Qsort(a,l,j-1);    Qsort(a,j+1,r);    return ;}



下面是利用qsort()函数来求数组a中第k小的数字(1<=k<=n,n<10^7)
分析:
选第k大的数,最显然的方法是先排序,然后直接输出下标为k-1的元素,但10^7的规模即使对于O(nlogn)的算法来说也稍微大了点,有没有其他办法呢?
答案是肯定的。假设在快排之后,数组a[p...r]被划分成a[p..q]和a[q+1..r],可以根据左边元素个数q-p+1和k的大小关系只在左边或者右边递归求解,可以证明,在期望意义下,程序时间复杂度为O(n),代码如下:

int Qsort(int *a,int l,int r,int k){    if(l>=r)    {        if(l==k-1)            return a[l];        if(r==k-1)            return a[r];        return -1;    }    int mid=(r+l)/2;    int temp=a[mid];    int i=l;    int j=r;    while(i<j)    {        while(a[i]<temp)    i++;        while(a[j]>temp)    j--;        if(i<j && a[i]==a[j])  j--;        else if(i<j)            swap(a[i],a[j]);    }    if(k-1==j)        return a[j];    else if(k-1<j)        return Qsort(a,l,j-1,k);    else return Qsort(a,j+1,r,k);}


0 0
原创粉丝点击