求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 heap = new PriorityQueue();
    for(int i=0;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的大小也会影响该算法的时间,但快排不会受到影响。

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





你可能感兴趣的:(数据结构)