8 回答

TA贡献1828条经验 获得超6个赞
有N(N>>10000)个整数,求出其中的前K个最大的数。(称作Top k算法问题)。由于(1)输入的大量数据;(2)只要前K个,对整个输入数据的保存和排序是相当的不可取的。可以利用数据结构的最小堆来处理该问题。
最小堆,对于每个非叶子节点的数值,一定不大于孩子节点的数值。这样可用含有K个节点的最小堆来保存K个目前的最大值(当然根节点是其中的最小数值)。每次有数据输入的时候可以先与根节点比较。若不大于根节点,则舍弃;否则用新数值替换根节点数值。并进行最小堆的调整。
由于仅仅保存了K个数据,有调整最小堆的时间复杂度为O(logK),因此TOp K算法(问题)时间复杂度为O(nlogK).

TA贡献1854条经验 获得超8个赞
你要的堆排,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);
}
}
}
添加回答
举报