微軟面試題系列(五) 查詢最小的 k 個元素

2021-09-04 01:24:16 字數 1198 閱讀 8756

好了,斷續微軟面試題的學習!看到題目,我首先想到的是樹狀陣列,後來看ppt才發現用樹狀陣列可以實現查詢第k大的元素,細想一下和這道題也差不多。網上的很多實現都是用堆做的,用堆大多數也是用c++的stl,multiset來實現。網上**很多,而且我也沒弄明白這題,先就不自己寫**了。

在這裡,給出乙個o(n)複雜度的實現:bfprt演算法。我也是才看到的,覺得很好,就先儲存下來。申明一下,暫時用的是別人的**.

第二個鏈結是乙個flash動畫,做得非常好!能讓人很清晰地看到這個演算法的執行過程。好了,還是把**貼出來吧!

/*

* problem_5.cpp

*尋找最小的k個數

*  created on: 2012-8-29

*      author: administrator

*/#include

#include

#include

#define max_value 10000

#define random() rand()%max_value

#define n 10

int a[n]; 

class find 

} int partition(int p,int r,int x) //陣列a中從a[p]到a[r]的元素按照x劃分,大於x的在左邊,小於x的在右邊 } 

} return i-1; 

} int select(int p,int r,int k) //尋找中位數

for(i=0;i<(r-p-4)/5;i++) 

int x=select(p,p+(r-p-4)/5,(r-p+6)/10); 

i=partition(p,r,x); 

int j=i-p+1; 

if(k<=j) 

return select(p,i,k); 

else

return select(i+1,r,k-j); 

} }; 

int main() 

coutfind f; 

int n=4; 

cout<<"the no."

<" is :"

//  elapsed=((double)(end-start));//clocks_per_sec;

//  cout<<"time: "<"個元素為:"

} return 0; 

面試題40 最小k個數

題目 輸入n個整數,找出其中最小的k個數 思路 1 如果輸入的陣列可以改變,則基於第k個數來調整,是第k個數左邊的數都小於第k個數,右邊的數都大於第k個數 時間複雜度o n 思路1 void printkminnumberbymethod1 int arr,int length,int k int ...

面試題之最小K個數

最小 最大k個數 是面試容易提及的其中乙個問題,此處用快排思路解決。思路 因為當選取的樞紐元等於k時,樞紐元左邊的序列元素必定小於k,右邊的序列元素必定大於k。儘管序列內部是無序的,但此時結果已符合題意。為避免產生多餘的排序工作,我們只需要在遞迴的時候分歧選擇最接近k的方向即可,一旦等於k就停止遞迴...

面試題 17 14 最小K個數

leetcode 面試題 17.14.最小k個數 easy 題 但是這道題是想考什麼 明顯很多種解法 排序暴力 topk 問題 大頂堆 使用 bfprt 在o n 內求解前k小的數 最壞時間複雜度 o n o n o n 劍指 offer 40.最小的k個數 中的解法一 基於快排的思想 一次快排 二...