問題描述:有一個整數數組,請你根據快速排序的思路,找出數組中第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個數,在後面的博客中會對於這個問題進行具體的說明的。。。。