無序陣列中找第K個的數

2021-06-28 04:57:41 字數 663 閱讀 3391

題目分析:也就是從小往大排,第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 重新調整為最大堆。接著,將...