求最小的K個數

2022-06-26 10:24:10 字數 923 閱讀 3774

方法一:利用快排的思想,複雜度為o(n)???

class

solution

input[low] =pivot;

return

low;

}vector

getleastnumbers_solution(vector input, int

k)

else

}vector

res(input.begin(), input.begin() +k);

return

res;

}};

方法二:利用堆排序的思想,時間複雜度為o(nlogk)

利用堆排序,特別適用於海量資料中尋找最大或者最小的k個數字。即構建乙個大堆容器,初始化大小為k,變數初始數,如初始陣列大小小於等於k直接返回,如果大於k,則選擇陣列的前k個元素,填充堆,然後調整為最大堆。調整完之後,繼續從初始陣列中拿出乙個元素,如果該元素比大堆的堆頂小,則替換堆頂,繼續調整為最大堆,如果大於等於堆頂則直接丟棄,不作調整。 

ps:大堆還是小堆的選擇很重要,不是尋找最小的k個元素就要選擇小堆,而且恰恰相反。尋找最小的k個數,其實就是尋找第k個大的元素,即尋找k個數中最大的,不斷調整堆,堆得元素個數是k,堆頂是最大值,遍歷完初始陣列後,堆中存在的元素即使我們所要尋找的k個最小元素。

class

solution

for(int i=(k-1)/2;i>=0;i--)

maxheap_down(max_heap,i,k-1

);

for(int i=k;i)

}return

max_heap;

}void maxheap_down(vector&a,int start,int

end)}}

};

求最小的第K個數

演算法分析 除了排序。大小堆,還可以用排序的演算法。我們每次以乙個基準元素進行快速排序,排序完之後,看這個基準元素的位置是否為k位置,如果大於k,那麼說明第k 小的元素在基準元素的左邊。然後從右邊選取基準元素進行快排。如果小於k,演算法相反 include include include inclu...

最小的K個數

問題描述 給定的n個整數,計算其中最小的k個數。最直觀的解法莫過於將n個數按公升序排列後輸出前k個。但是就效率來看,這種方法並不是最理想的。一種改進方法是借助快速排序中對陣列的劃分,以第k個元素對陣列進行劃分,使得比第k個數字小的數字都在其左邊,比其大的數字都在它的右邊。void swap int ...

最小的K個數

從 陣列中出現次數超過一半的數字 得到啟發,同樣可以基於partition函式來解決。一 o n 演算法 void getleastnumbers int input,int n,int output,int k else for int i 0 i k i output i input i 二 o...