题目:从100万个数里面找出10个最大的数。写出代码并分析复杂度。
分析:
拿出这组数据的前10个数构建一个小根堆(堆排序:升序排序10个数,先建一个大根堆,再将堆顶的最大值与最后一个值交换,这样不断循环直到排好序成为一个小根堆),这个堆将保存数据中最大的10个数,接下来遍历剩下的数据,遇到比堆顶元素小的元素直接跳过,遇到比堆顶元素大的,替换堆顶元素,再对堆进行维护(也就是排序的过程),当遍历完数组,堆中保存的就是最大的的10个元素。
复杂度:O(n)
维护长度为10的堆对于遍历大量数据可以忽略不计,所以复杂度为遍历的复杂度O(n)。
代码:
import java.util.Arrays;
public class Sort {
public static void main(String[] args) {
int[] arr = new int[1000000];
for(int i=0;i<arr.length; i++){
arr[i] = i+1;
}
int[] result = sort(arr,10);
System.out.println(Arrays.toString(result));
}
public static int[] sort(int[]arr, int