//选择问题,此算法借助快速排序的思想来解决
//问题描述,在a[left:right]中找第k小的元素
#define NUM 100
int a[NUM];
int select(int left,int right,int k)
{
//找到了第K小的元素
if(left>=right)
return a[left];
//从左到右的指针
int i=left;
//从右到左的指针
int j=right+1;
//把最左边的元素作为分解参考数据
int pivot=a[left];
//把左侧>=pivot的元素和右侧<=pivot的元素交换
while(true)
{
do{
i++;
}while(a[i]<pivot);
do{
j--;
}while(a[j]>pivot);
//没有发现可交换对象
if(i>=j)
break;
swap(a[i],a[j]);
}
//刚好是中间的那个参考值
if(j-left+1==k)
return pivot;
a[left]=a[j]; //存储pivot
a[j]=pivot;
//如果没有在前半段
if(j-left+1<k)
return select(j+1,right,k-(j-left+1));
else
return select(left,j-1,k);
}
分治思想解,选择问题(从给定数组中找第K小的元素)
最新推荐文章于 2024-08-18 19:33:19 发布