8 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊
有N(N>>10000)個(gè)整數(shù),求出其中的前K個(gè)最大的數(shù)。(稱(chēng)作Top k算法問(wèn)題)。由于(1)輸入的大量數(shù)據(jù);(2)只要前K個(gè),對(duì)整個(gè)輸入數(shù)據(jù)的保存和排序是相當(dāng)?shù)牟豢扇〉?。可以利用?shù)據(jù)結(jié)構(gòu)的最小堆來(lái)處理該問(wèn)題。
最小堆,對(duì)于每個(gè)非葉子節(jié)點(diǎn)的數(shù)值,一定不大于孩子節(jié)點(diǎn)的數(shù)值。這樣可用含有K個(gè)節(jié)點(diǎn)的最小堆來(lái)保存K個(gè)目前的最大值(當(dāng)然根節(jié)點(diǎn)是其中的最小數(shù)值)。每次有數(shù)據(jù)輸入的時(shí)候可以先與根節(jié)點(diǎn)比較。若不大于根節(jié)點(diǎn),則舍棄;否則用新數(shù)值替換根節(jié)點(diǎn)數(shù)值。并進(jìn)行最小堆的調(diào)整。
由于僅僅保存了K個(gè)數(shù)據(jù),有調(diào)整最小堆的時(shí)間復(fù)雜度為O(logK),因此TOp K算法(問(wèn)題)時(shí)間復(fù)雜度為O(nlogK).

TA貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊

TA貢獻(xiàn)1854條經(jīng)驗(yàn) 獲得超8個(gè)贊
你要的堆排,JAVA
public class 堆排 {
public static void main(String[] args) {
int [] arr= {0,5,3,2,6,7};
HeapSort(arr);
for(int s:arr){
System.out.println(s);
}
}
public static void BuildHeap(int[] arr,int s,int length){
int temp = arr[s];
for(int j = s*2 +1 ; j<length;j = j*2 +1){
if(j+1<length && arr[j]>arr[j+1]){
j++;
}
if(temp < arr[j]){
break;
}
arr[s] = arr[j];
s = j;
}
arr[s] = temp;
}
public static void HeapSort(int[] arr){
for(int i = (arr.length)/2-1;i>=0;i--){
BuildHeap(arr, i, arr.length);
}
for(int i = arr.length - 1;i>=0;i--){
if(arr[0]!= arr[i]){
arr[i] ^= arr[0];
arr[0] ^= arr[i];
arr[i] ^= arr[0];
}
BuildHeap(arr, 0, i);
}
}
}
添加回答
舉報(bào)