問: 從arr[1, n]這n個數中,找出最大的k個數
-
對數組進行全部排序,時間複雜O(n*lg(n))
-
只對最大k個數排序,比如冒泡算法,冒K個泡,就可以拿到最大的K個數
-
利用最小堆解決
步驟一、找出數組前k個數,組成最小堆
步驟二、遍歷剩餘n-k個元素,對比每個元素和堆頂大小
步驟三、如果大,則替換堆頂的元素,然後調整;如果小則continue。保證堆裏面的元素總是最大的
步驟四、遍歷堆 -
利用隨機算法,減治法的思想解決
步驟一、取出第一個元素,遍歷一遍數組,將大於這個元素放到左邊,小於這個元素放到右邊,並且返回這個元素的下標i
步驟二、對比下標i和k的大小,如果大,arr[i]左邊的元素都大於k,然後遞歸arr[1,i-1]裏第k大的元素;如果小於,那麼遞歸arr[i+1,n]第k-i大的元素即可
步驟三、最終會得到第k大的元素,然後對整個arr做一次partition,拿到最大k個數。
僞代碼:
int RS(arr, low, high, k){
if(low== high) return arr[low];
i= partition(arr, low, high);
temp= i-low; //數組前半部分元素個數
if(temp>=k)
return RS(arr, low, i-1, k); //求前半部分第k大
else
return RS(arr, i+1, high, k-i); //求後半部分第k-i大
}