分治法解选择问题

   选择问题: 求n个元素中的第k小的元素。

算法如下:

#include<stdio.h>

void swap(int &x,int &y)
{
    int t;
    t=x;x=y;y=t;
}

//在a[ left: right]中选择第k小的元素
int select(int a[],int left,int right,int k) 
{
    int i,j,pivot;
    if(left>=right) return a[left];
    pivot=a[left];
    i=left+1;
    j=right;
    while(1)
    {
        while(a[i]<pivot)
        {
            i=i+1;
        }
        while(a[j]>pivot)
        {
            j=j-1;
        }
        if(i>=j) break;
        swap(a[i],a[j]);
    }
    if(j-left-1+1 +1==k) return pivot;

    a[left]=a[j];  //存储pivot
    a[j]=pivot;

    if(j-left+1<k)
        return select(a,j+1,right,k-j-1+left);
    else
        return select(a,left,j-1,k);
}


int main()
{
    int a[10]={3,2,5,4,1,6,7,10,9,8};
    int res=select(a,0,9,7);
    printf("%d\n",res);
}
    
原文地址:https://www.cnblogs.com/youxin/p/2486735.html