1. 程式人生 > >有 n 個無序整數,則找出其中最大的 M 個數字所需要的最小時間複雜度:

有 n 個無序整數,則找出其中最大的 M 個數字所需要的最小時間複雜度:

有 n 個無序整數( n>10000), 則找出其中最大的 M 個數字(5< M<10), 所需要的最小時間複雜度:

看了很多部落格和論壇,這道題我找到了兩種方法,在這裡總結一下。

兩種方法都用到了堆排序,那麼首先回顧一下堆排序:

堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為O(nlogn),它也是不穩定排序. 

第一種演算法:
直接對n個數進行堆排序,每次建立一個大根堆,只需完成排序的前m次。這種的方法時間複雜度是O(mlogn),每建立一次大根堆需要 logn 的時間,總共m次。

第二種演算法:
最開始選取前m個數,用這m個數建立一個小根堆。接下來,對後面n-m個數進行遍歷,用根結點與這n-m個數進行比較,當發現一個數比根結點大時,交換,然後重新建立一個小根堆。最終我們可以得到m個最大的數字。這種方法的時間複雜度是O(nlogm).