輸出陣列第k大的元素

2021-09-21 16:20:19 字數 2630 閱讀 2008

用快速排序的思想輸出陣列第k大的元素:

1 #include2 #include3

using

namespace

std;45

//遞迴實現:返回陣列第k大的值.陣列下標區間是[begin,end].其中陣列假定n個元素,則k的值在區間[1,n]. 6//

能夠使用這種方法的前提條件是:n個數不能重複。如果n個數中有重複,那麼區間的大小不能保證就是第k大。

7int findkth(int* arr, int begin, int end, intk)8

18 arr[i]=key;

1920

//遞迴的結束條件為某一記錄剛好劃分到第k個位置

21//

由於陣列從0開始,所以需要加1了

22if (i == k-1)return

arr[i];

23else

if (i < k-1) return findkth(arr, i+1

, end, k);

24else

return findkth(arr, begin, i-1

, k);25}

2627

28//

只做了一輪劃分,沒有遞迴完成快速排序.返回的是劃分的下標。陣列a下標區間[low,high]

29 template

30int partition(t a,int low,int

high)

3141 a[i]=key;

42return

i;43}44

45//

利用快速排序的思想查詢第k大的數值

46//

第乙個引數代表要查詢的陣列

47//

第二個引數代表陣列的長度

48//

第三個引數代表要查詢第幾大的元素

49//

非遞迴50 template

51 t findkth2(t a,int n,int

k)52

63else

if(pos>n-k)

6468}69

}7071int

main() 72;

74int b[11]=;

75int c[11]=;

7677

for(int i=0;i<11;i++) cout<"";

78 cout<79 sort(a,a+11

);80

for(int i=0;i<11;i++) cout<"";

81 cout<8283

for(int i=11;i>=1;i--)

84 cout<0,10,i)<<"";

85 cout<8687

for(int i=11;i>=1;i--)

88 cout<11,i)<<"";

89 cout<9091

92 cout93for(int i=0;i<11;i++) cout<"";

94 cout<95for(int i=0;i<11;i++) cout<"";

96 cout<97return0;

98 }

參考:

利用快速排序的特點:第一遍排序會確定乙個數的位置,這個數左邊都比它大,右邊都比他小(降序),當左邊區間大於k時,說明我們求的第k大數在左邊區間,這時我們可以捨棄右邊區間,將範圍縮小到左邊區間從而重複上述過程,直到確定乙個數的位置時,左邊區間的小是k-1那麼這個數字就是我們所求。右邊同理。

能夠使用這種方法的前提條件是:n個數不能重複。如果n個數中有重複,那麼區間的大小不能保證就是第k大。可以用hash判重來將重複的資料去掉。然後再使用上述方法。

1

/*** created with intellij idea.

2* user: hqtc

3* date: 16-3-22

4* time: 下午9:52

5* to change this template use file | settings | file templates. 6*/

7public

class

quicksort

15if (low 16 nums[low++] =nums[high];

17while (k > nums[low] && low 20if (low 21 nums[high--] =nums[low];22}

23 nums[low] =k;

24return

low;25}

2627

public

void sort(int num, int low, int

high) 33}

3435

public

int findkthmax(int arr, int k, int left, int

right) else

else45}

46}47}

4849

/*50

5152

*/

陣列中第k大的元素

問題描述 在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。示例 1 輸入 3,2,1,5,6,4 和 k 2 輸出 5 示例 2 輸入 3,2,3,1,2,4,5,5,6 和 k 4 輸出 4 說明 你可以假設 k 總是有效...

尋找陣列中的第K大的元素

遇到了乙個很簡單而有意思的問題,可以看出不同的演算法策略對這個問題求解的優化過程。問題 尋找陣列中的第k大的元素。最簡單的想法是直接進行排序,演算法複雜度是o n logn 這麼做很明顯比較低效率,因為不要求別的資訊只要計算出第k大的元素。當然,如果在某種情況下需要頻繁訪問第k大的元素就可以先進行一...

陣列第K大

和第k小剛好相反 有乙個整數陣列,請你根據快速排序的思路,找出陣列中第k大的數。給定乙個整數陣列a,同時給定它的大小n和要找的k k在1到n之間 請返回第k大的數,保證答案存在。測試樣例 1,3,5,2,2 5,3 返回 2 先排序 快排 二分 第k大,則說明是第n k 1小 目的下標為n k 根據...