快速排序求第k小的数,思想非常简单,就是如果要查找的k比当前下标low小,则只递归左部分,大则递归右部分,相等则递归右部分,当然由于数组下标从0开始,所以应该是k-1,(比如第一大的数数组下标为0),原理就是快速排序是以一个元素为分隔的,如果求第k大的元素,就是求第n-k+1小的元素.
#include <stdio.h>
int i,j;
void quicksort(int a[],int left,int right,int k)
{
int i,j,key,low,high;
low=left;
high=right;
key=a[left];
if (left<right)
{
while(low<high)
{
while((low<high)&&(a[high]>=key))
high--;
a[low]=a[high];
while((low<high)&&(a[low]<=key))
low++;
a[high]=a[low];
}
a[low]=key;
if (low==k-1)
printf("%d\n",a[low]);
else
{
if (low<k-1)
quicksort(a,low+1,right,k);
else
quicksort(a,left,low-1,k);
}
}
}
int main()
{
int n,k,i,j;
int a[1005];
scanf("%d%d",&n,&k);//n代表数组长度,K代表求第k小的数,如果求第k大的数,就是n-k+1大的数
for (i=0;i<n;i++)
scanf("%d",&a[i]);
quicksort(a,0,n-1,k);
return 0;
}