#每日一題#網易2016實習研發工程師筆試題

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

發佈了65 篇原創文章 · 獲贊 19 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章