查詢最小的k個數

2022-03-10 23:43:02 字數 458 閱讀 2821

乙個整型陣列,有n個元素,可以含有重複元素。 查詢該陣列中最小的k個數。

(1)對陣列快速排序,然後從前往後依次挑出最小的k個元素,時間複雜度:nlogn + k = nlogn

(2)設定乙個容量是 k 的臨時陣列,掃瞄目的陣列,如果臨時陣列元素個數小於k,直接填入臨時陣列,如果臨時陣列元素個數大於k,找出臨時陣列的最大的元素,如果掃瞄的元素大於或等於最大元素直接過濾掉,如果小於,就替換掉這個最大元素。 時間複雜度是:k + (n - k)*k = nk

(3)相比較(2)的差異,當臨時陣列填滿k個元素後,立即建成最大堆(建堆時間複雜度o(k)),以後,每次掃瞄的元素大於或等於堆頂,直接過濾掉,否則替換堆頂並調整堆。

時間複雜度是:k + k + (n - k)*logk = nlogk

(4)把原始陣列建成最小堆,刪除k次堆頂,即吐出k個最小值。 時間複雜度是 n + k*logn = max( n, k*logn)

查詢最大的K個數 查詢最小的K個數

使用乙個容器,大小為k 用這個容器來儲存這最大的或者最小的k個數。如果是找最大的k個數,那麼,每次和容器中的最小元素比較,如果最小的元素小於當前元素,那麼刪除這個最小的元素,同時將當前元素插入 如果是找最小的k個數,那麼就和容器中最大的元素比較。同理。容器用哪個呢?容器選擇用set,set本身就是排...

查詢最小的K個數

輸出最小的k個數 方案1 如果輸入的陣列可變,我們可以借助partion部分排序的思想,隨機選k值,經過排序後,k左邊的數都比k小,k右邊的數都比k大,這樣經過排序後,在k左邊的數字就是最小的k個數 int partion int a,int n,int left,int right if left...

查詢陣列中最小k個數

思路 可採用大頂堆來實現 維護乙個規模為k的大頂堆。從前往後掃瞄陣列元素 若大頂堆的size小於k,則把當前元素插入大頂堆中 若小於k,若當前元素小於堆頂元素,則刪除堆頂元素,插入當前元素。考慮到從頭實現乙個大頂堆比較麻煩,這裡使用treeset容器,它提供有序的set。treeset底層實際使用的...