問題描述
給定乙個大小為n的陣列s和乙個整數k,請找出陣列中的第k小元素。
這是乙個補充程式的試題,你需要完成乙個函式:
int findkth(int *s, int n, int k)
表示在s指向的陣列中找到第k小的元素(如果k=1,表示找最小元素),你需要返回該元素的值。
此題對時間的要求比較高,請注意下面的演算法描述。
演算法描述
你可以直接將s中的元素進行排序後輸出第k小的元素,但使用這種方法你大概只能得到30%的分數。
要在乙個陣列中查詢第k小的元素,可以模仿快速排序的做法,即對於陣列s[0..n-1],首先用陣列中的任意乙個元素(可以取第乙個)將陣列分為三個部分:s[0..p-1], s[p], s[p+1..n-1],其中s[0..p-1]中的值都不大於s[p],s[p+1..n-1]中的值不小於s[p]。
此時,如果p=k-1,則s[p]是要查詢的元素,返回s[p]。
如果p>=k,則第k小的元素一定在s[0..p-1]中,可以在s[0..p-1]中查詢第k小的元素。
如果p這是一道完善程式的試題,你只需要在下面程式標註的"@你的**
"的位置補充適當的語句或語句段使程式能正確執行即可,在提交的時候,你要提交的內容只包括補充的內容,不包括其他的**。
int findkth(int *s, int n, int k)
演算法實現:
#include int findkth (int * s, int n, int k)
s[low] = pivot;
if (low == k - 1)
return s[low];
else if (low > k - 1)
return findkth (s, low, k);
else
return findkth (s + low + 1, n - low - 1, k - low - 1);
}int main(void){
int data[10000];
int n;
int k;
int i;
scanf ("%d%d", &n, &k);
for (i=0; i
QuickSelect 查詢第 K 小的元素
quick select演算法通常用來在未排序的陣列中尋找第 k 小 第 k 大的元素。其方法類似於quick sort。本質上是通過多次快速排序,當某次快速排序的樞紐元素恰好下標為 k 1 時,結束查詢 package main import fmt func core nums int,k,st...
分治演算法四(查詢第K小元素)
1.問題描述 對於乙個非有序的陣列a start.end 求陣列中第k小的元素 2.解決思路 最直觀的的方式,先對陣列排序,複雜度為o nlgn 但是這樣複雜度太大,可以利用快速排序的思路,解決這個問題,並且複雜度為o n 關鍵在於劃分只乙個部分,我們知道快速排序選擇乙個pivot對陣列進行劃分,左...
查詢第k小的元素 O n 遞迴解法
今天分享乙個小技巧,雖然是小技巧但是還是很有價值的,曾經是微軟的面試題。題目是這樣的,乙個無序的陣列讓你找出第k小的元素,我當時看到這道題的時候也像很多人一樣都是按普通的思維,先排序在去第k個,但是當陣列非常大的時候,效率不高,那有沒有簡單的方法了,其實我們早就學過,只是我們不善於思考和變通。很多人...