13.2:堆排序 复杂度O(N * logN)

13.2:堆排序

   

   基于比较的排序时间复杂度O(N * logN)是最好的了

 

  理解了堆以及堆里面的heapInsert() 和heapify(),堆排序就简单了。

  1、把数组中的所有数都调成大根堆。heapSize = N。

  2、0位置的数和N-1位置的数进行交换。heapSize = N - 1。

     N - 1位置的数和堆断开,N-1位置的数输出。

  3、从0位置到N-2位置进行heapify,调成大根堆。

  4、0位置的数和N-2位置的数进行交换。heapSize --。

     N - 2位置的数和堆断开,N-2位置的数输出

  5、........................重复过程.......................

  6、直到heapSize  == 0;

 

 

    // 堆排序额外空间复杂度O(1)
    public static void heapSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
    
        for (int i = 0; i < arr.length; i++) { // O(N)
            heapInsert(arr, i); 
        }
    
        int heapSize = arr.length;
        swap(arr, 0, --heapSize);
        // O(N*logN)
        while (heapSize > 0) { // O(N)
            heapify(arr, 0, heapSize); // O(logN)
            swap(arr, 0, --heapSize); // O(1)
        }
    }

 

posted @ 2022-05-16 19:31  yzmarcus  阅读(29)  评论(0)    收藏  举报