问题描述:有一个整数数组,请你根据快速排序的思路,找出数组中第k大的数。
给定一个整数数组a,同时给定它的大小n和要找的k(k在1到n之间),请返回第k大的数,保证答案存在。
测试样例:
【1,3,5,2,2】,5,3
返回:2
根据题目的要求:我们利用快速排序的思路,递归时要对于k与i的值进行对比。
下面给出具体的代码:
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
//寻找第k大的数
int quicksortk(int *a,int left,int right,int k)
{
int i = left;
int j = right;
int x = a[left];
if(left < right){
while(i < j){
for(;j > i && a[j] < x;j--);
if(j > i){
a[i++] = a[j];
}
for(;i < j && a[i] > x;i++);
if(i < j){
a[j--] = a[i];
}
}
a[j] = x;
if(k == j){
return i;
}else if(k > j){
//右递归
quicksortk(a,j + 1,right,k);
}else{
//左递归
quicksortk(a,left,j - 1,k);
}
}
}
测试程序:
int main(int argc,char**argv)
{
int n;
int *a = NULL;
int i;
int k;
int value;
while(1){
printf("请输入数组的长度n:(-1 quit)\n");
scanf("%d",&n);
if(n == -1){
printf("error!!\n");
exit(1);
}
a = (int *)malloc(sizeof(int) * n);
bzero(a,sizeof(int) * n);
printf("请输入数组元素:\n");
for(i = 0;i < n;i++){
scanf("%d",a + i);
}
printf("请输入k的值:\n");
scanf("%d",&k);
value = quicksortk(a,0,n - 1,k - 1);
printf("第%d大的数:%d\n",k,a[value]);
printf("\n");
free(a);
}
return 0;
}
其执行结果:
其实这样的笔试题算是比较基础的东西,革命尚未成功,同志仍需努力!!!! 在编程之美那本书上也有过类似的问题,只不过它要求寻找的是最大的k个数,在后面的博客中会对于这个问题进行具体的说明的。。。。