有 n 个无序整数( n>10000), 则找出其中最大的 M 个数字(5< M<10), 所需要的最小时间复杂度:
看了很多博客和论坛,这道题我找到了两种方法,在这里总结一下。
两种方法都用到了堆排序,那么首先回顾一下堆排序:
堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序.
第一种算法:
直接对n个数进行堆排序,每次建立一个大根堆,只需完成排序的前m次。这种的方法时间复杂度是O(mlogn),每建立一次大根堆需要 logn 的时间,总共m次。
第二种算法:
最开始选取前m个数,用这m个数建立一个小根堆。接下来,对后面n-m个数进行遍历,用根结点与这n-m个数进行比较,当发现一个数比根结点大时,交换,然后重新建立一个小根堆。最终我们可以得到m个最大的数字。这种方法的时间复杂度是O(nlogm).