問題: 查詢出一給定陣列中第k大的數。例如[3,2,7,1,8,9,6,5,4],第1大的數是9,第2大的數是8……
思考:1. 直接從大到小排序,排好序後,第k大的數就是arr[k-1]。
2. 只需找到第k大的數,不必把所有的數排好序。我們借助快速排序中partition過程,一般情況下,在把所有數都排好序前,就可以找到第k大的數。我們依據的邏輯是,經過一次partition後,陣列被pivot分成左右兩部分:s左、s右。當s左的元素個數|s左|等於k-1時,pivot即是所找的數;當|s左|小於k-1,所找的數字於s右中;當|s左|>k-1,所找的數字於s左中。顯然,後兩種情況都會使搜尋空間縮小。
#includeusing namespace std;
int partition(int a, int i, int j)
a[i] = temp;
return i;
}}int search(int a, int i, int j, int k)
{ int m = partition(a, i, j);
if (k==m-i+1) return a[m];
else if (k參考博文:
查詢陣列中第k大的數字
其實之前寫的6 11 求自定型別元素序列的中位數 是求第k大數字的乙個特例。當時是將某一陣列全部按照由大到小排列後,才取出中位數輸出。然後昨天看資料結構時候才發現可以不完全排序,只拍第0到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 根據...
陣列中第k大的數
方法 有兩種。參見 第一種 使用排序 快速排序 將陣列排序後,第k大的數就在第k個位置上。演算法複雜度 o n logn 第二種 類似快速排序的變種。通過二分的思想,找到第k大的數字,而不必對整個陣列排序。從陣列中隨機選乙個數t,通過讓這個數和其它數比較,我們可以將整個陣列分成了兩部分並且滿足,在將...