求陣列中最大的K個數

2021-08-14 09:58:13 字數 1312 閱讀 8377

最容易想到的就是迴圈遍歷陣列k次求出最大的k個數。

這個演算法有許多的缺點:第一點就是速度不夠,它的時間複雜度中o(k*n),當陣列很大時,不能全部載入到記憶體中,這個演算法就不可行了。

這道題目還有兩種比較優的解法:

1.我們可以利用快速排序中的思想,快速排序每次都把資料分為兩個部分,第一部分大於某個數,第二部分小於某個數。

我們可以利用這點解決這個題目,我們先用利用快速排序中的分隔函式,返回乙個下標,以下標為分隔,第一部分大於這個數,第二部分小於這個數。如果第一部分的長度等於k,則返回,如果第一部分的長度》k,則繼續以上步驟,如果第一部分的長度小於k,則在另一部分中尋找k-index個數。直接上**。

//s是陣列開始位置,b是陣列結束下標

private

void test(int array,int k,int s,int b)

}else

if (indexfor (int i=0;i1;i++)

test(array,k-index,index,array.length-1);

}else

}//把陣列分為兩個部分,前面是大數,後面是小數

private

int partition(int array,int s,int e)

array[s]=array[e];

while (sarray[s])

array[e]=array[s];

}array[e]=temp;

return s;

}

這個演算法解決了速度問題,但是當陣列無法載入到記憶體中時,這個演算法也無法使用了。下面請看第二個演算法。

我們可以使用最小堆儲存陣列中最大的k個數,我們取陣列前k個數,作為最大的k個數,建最小堆,這個堆中堆頂元素是這個k個數中最小的數,我們可以遍歷陣列,與堆頂元素比較,如果大於堆頂元素,我們就替換堆頂元素,然後調整堆為最小堆。當迴圈結束時,我們堆中儲存的,也就是陣列中最大的k個數了。**如下:

private

void find(int array,int k)

createheap(result);

for (int i=k;i}

print(result);

}//建立乙個最小堆

private

void createheap(int array)

}//調整最大堆

private

void adjustheap(int array,int s)

if (array[s]>array[child])

}}

演算法題 求陣列中最小的k個數

題目 輸入n個整數,找出其中最小的k個數。劍指offer 給出了兩種實現演算法 演算法1 採用partition 遞迴法,該演算法可以說是快速排序和二分查詢的有機結合。演算法的時間複雜度為o n 缺點在於在修改partition的過程中會修改原陣列的值。演算法2 採用top k演算法。如果要找最小的...

TopK 求陣列中N個資料中最大的K個元素

topk問題求解的最佳方式就是使用堆。要求最大的k個元素,所以我們建乙個有k個元素的堆 為了方便,直接將前k個值放到堆中 調整堆的形態為小堆,堆頂的元素是最小值,將陣列中的每個數字和堆頂比較,如果該數大於堆頂,就把堆頂換成該數,同時使用堆的向下調整操作,將堆調整成排好序的堆,這樣依次迴圈,最後得到的...

求陣列中最大的值

示例 求陣列 2,6,1,77,52,25,7 中的最大值 宣告乙個儲存最大元素的變數 max。預設最大值可以取陣列中的第乙個元素。遍歷這個陣列,把裡面每個陣列元素和 max 相比較。如果這個陣列元素大於max 就把這個陣列元素存到 max 裡面,否則繼續下一輪比較。最後輸出這個 max var a...