清橙OJ 1082 查詢第K小元素 快速排序

2022-07-27 22:42:15 字數 1106 閱讀 3221

問題描述

給定乙個大小為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個,但是當陣列非常大的時候,效率不高,那有沒有簡單的方法了,其實我們早就學過,只是我們不善於思考和變通。很多人...