/************************************************
以期望线性时间做选择:返回数组A[p,r]中第i小的数
算法通过分治递归划分,像快排那样,将数组划分成两边,
然后根据情况,处理划分后的某一边,算法伪代码如下:
select(A,p,r,i)
if p=r
then return A[p]
q<——partion(A,p,r)
k<——q-p+1
if i=k //第i小的数恰好在为分割点
then return A[q]
else if i<k //第i小的数在左边部分
then return select(A,p,q-1,i)
else // 第i小的数在右边部分
return select(A,q+1,r,i-k)
************************************************/
#include <stdio.h>
#define MAX_INT ~(1<<31)
int partition(int *arr,int low,int high)
{
int pivot=arr[high];
int i=low-1;
int j,tmp;
for(j=low;j<high;++j)
if(arr[j]<pivot){
tmp=arr[++i];
arr[i]=arr[j];
arr[j]=tmp;
}
tmp=arr[i+1];
arr[i+1]=arr[high];
arr[high]=tmp;
return i+1;
}
int select(int *arr,int p,int r,int i)
{
if(arr==NULL || p<0 || p>r)
return MAX_INT;
if(p==r)
return arr[p];
int q=partition(arr,p,r);
int k=q-p+1;
if(i==k)
return arr[q];
else if(i<k)
return select(arr,p,q-1,i);
else
return select(arr,q+1,r,i-k);
}
int main()
{
int arr[10]={1,4,6,2,5,8,7,6,9,12};
printf("the 5th number is:%d\n",select(arr,0,9,5));
}
(六)线性选择
最新推荐文章于 2023-12-27 16:35:04 发布