求n个数中前k大的数(排序)

            

这题两种思路,一种很直接的思路就快排,另一种是堆,我们来看下这两种算法的区别。

第一种是快排,直接用快排将n个数排成有序,然后将前k大的数输出。平均时间复杂度为O(nlogn),空间复杂度为O(logn)。

代码献上:

public static void quickSort(int arr[],int k) {
    Arrays.sort(arr);
  
    for(int i=n-1;i>=n-10;i--)
    System.out.println(arr[i]);
 }

这里是n=100000000  k=10时的耗时:

当n很大时快排的时间也令人难以忍受,这时候可以考虑使用堆。


第二种是用一个大小为k的小根堆,先初始化为最小值(比n个数里面的任意值都小即可,这里初始为0),然后顺序遍历整个数组,如果大于堆顶元素则将其堆顶元素弹出并将其加入。平均时间复杂度O(nlogk),空间复杂度为O(k)。

代码献上:

这里是n=100000000  k=10时的耗时:public static void heapSort(int arr[],int k) {
Queue<Integer> heap = new PriorityQueue<Integer>();
    for(int i=0;i<k;i++)
    heap.add(0);
  
    for(int t:arr)
        if(t>heap.peek()) {
            heap.poll();
            heap.add(t);
        }
  
    for(int t:heap)
    System.out.println(t);
 }

这里是n=100000000  k=10时的耗时:

另外这是n=100000000  k=1000时的耗时:k的大小也会影响该算法的时间,但快排不会受到影响。

如果你有更好的思路欢迎在评论区分享交流,感谢观看。




发布了20 篇原创文章 · 获赞 8 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览