【程序】
#include <stdio.h>
#define N 100
void swap(int *p,int *q) //交换
{
int t;
t=*p;
*p=*q;
*q=t;
}
int Partition(int a[],int l,int r) //一趟排序返回基准
{
int i,j,p;
p=a[l];
i=l;j=r+1;
while(i<j)
{
do{
i++;
} while(p>a[i]);
do{
j--;
}while(p<a[j]);
swap(&a[i],&a[j]);
}
swap(&a[i],&a[j]);
swap(&a[l],&a[j]);
return j;
}
int Quickselect(int a[],int l,int r,int k)
{
int s;
s=Partition(a,l,r); //返回基准
if(k-1==s)
return a[s];
else if(k-1<s) //在基准左边
Quickselect(a,l,s-1,k);
else
Quickselect(a,s+1,r,k); //在基准右边
}
int main()
{
int a[N],i,n,k,m;
printf("请输入元素个数:");
scanf("%d",&n);
printf("请输入数组元素:");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("请输入第k小的数:");
scanf("%d",&k);
m=Quickselect(a,0,n-1,k);
printf("%d\n",m);
}
本文介绍了一个高效的查找数组中第k小元素的算法——快速选择算法。该算法基于快速排序算法,通过一趟排序找到基准元素,并根据基准位置递归地在左侧或右侧子数组中继续寻找目标元素。文中提供了一个完整的C语言实现示例。
1381

被折叠的 条评论
为什么被折叠?



