在一组随机的数中找到第K小数。
思路:跟快速排序的思路长不多。快排每次能找到数组A中第N小的数。如果K=N,那么A[k]就是我们想要得到的结果;如果K>N,则递归在数组的左侧继续找第N小数;如果K<N,则递归在数组的右侧找第N-K小数。
#include "stdio.h"
#include "stdlib.h"
int findK(int *,int ,int);
void main()
{
int n;
printf("请输入所有数的个数:\n");
scanf("%d",&n);
int *num;
num = (int*)malloc(n*sizeof(int));
for(int i = 0 ; i < n ; i++)
{
printf("请输入第%d个数:\n",i+1);
scanf("%d",&(num[i]));
}
int k;
printf("请输入k的值:\n");
scanf("%d",&k);
int result = findK(num,k,n);
printf("数组中第%d小的数为:%d",k,result);
char c;
scanf("%c",&c);
scanf("%c",&c);
}
int findK(int * array,int k,int n)
{
int *left = new int[n];//与标准的快排有差别,我通过新开一个长度为n的数组来存储左边的数组
int *right = new int[n];
int lNum = 0,rNum = 0;
for(int i = 1 ; i < n ; i++)
{
if (array[i] < array[0])
{
left[lNum] = array[i];
lNum++;
}
else if (array[i] >= array[0])
{
right[rNum] = array[i];
rNum++;
}
}
left[lNum] = array[0];
lNum++;
if (lNum == k)
return left[lNum-1];
else if(lNum > k)
return findK(left,k,lNum);
else if (lNum < k)
return findK(right,k-lNum,rNum);
}