題目分析:也就是從小往大排,第k小那個數。
方法1:排序(nlogn)
方法2:利用堆(nlogk)
首先將前k個元素構建最大堆,堆頂是前k個元素中第k小的元素。(這步複雜度klogk)
遍歷剩餘元素(這步複雜度(n-k)logk)
如果新元素《堆頂 堆頂不可能是第k大元素 移除堆頂 將新元素插入堆
否則 新元素不可能是第k大的元素
返回堆頂就是結果
方法3:利用快排partition o(n)
遞迴方法
int kth(integera, int left, int right, int k)
非遞迴方法
int kth(integera, int left, int right, int k)
}
複雜度計算:o(n + n/2 + n/4 +...+ 1) = o(2n) = o(n)
拓展題
兩個無序陣列找第k(先合併 再找第k)
兩個有序陣列找第k
無序整數陣列中找第k大的數
寫一段程式,找出陣列中第k大小的數,輸出數所在的位置。解法一 我們先假設元素的數量不大,例如在幾千個左右,在這種情況下,那我們就排序一下吧。在這裡,快速排序或堆排序都是不錯的選擇,他們的平均時間複雜度 都是 o n log2n 然後取出前 k 個,o k 總時間複雜度 o n log2n o k o...
無序整數陣列中找第k大的數
經典問題 寫一段程式,找出陣列中第k大的數,輸出數所在的位置。我們先假設元素的數量不大,例如在幾千個左右,在這種情況下,那我們就排序一下吧。在這裡,快速排序或堆排序都是不錯的選擇,他們的平均時間複雜度 都是 o n logn 然後取出前 k 個,o k 總時間複雜度 o n logn o k o n...
從無序陣列中找出第K大的數
該題目的兩種實現方式,第一種是用堆排序 其中陣列用到了二叉樹的性質 第二種是利用快速排序來實現.最大堆進行公升序排序,主要步驟是 1.初始化堆 將數列a 1.n 構造成最大堆。2.交換資料 將a 1 和a n 交換,使a n 是a 1.n 中的最大值 然後將a 1.n 1 重新調整為最大堆。接著,將...