【问题标题】:How to perform inplace sorting of min-heap using heap-Sort?如何使用堆排序对最小堆进行就地排序?
【发布时间】:2015-11-28 16:38:09
【问题描述】:

每当我在最小堆上进行堆排序时,我都会得到反向排序的数组。

有没有什么方法可以在不使用额外空间的情况下使用堆排序对最小堆进行排序?

【问题讨论】:

    标签: sorting data-structures heap heapsort


    【解决方案1】:

    使用 max-heapify 升序排序,min-heapify 降序排序。

    这是堆排序的伪代码。

    Heapsort(A) {
       BuildHeap(A)
       for i <- length(A) downto 2 {
          exchange A[1] <-> A[i]
          heapsize <- heapsize -1
          Heapify(A, 1)
    } 
    
    BuildHeap(A) {
       heapsize <- length(A)
       for i <- floor( length/2 ) downto 1
          Heapify(A, i)
    }
    
    
    Heapify(A, i) {
       le <- left(i)
       ri <- right(i)
       if (le<=heapsize) and (A[le]>A[i])
          largest <- le
       else
          largest <- i 
       if (ri<=heapsize) and (A[ri]>A[largest])
          largest <- ri
       if (largest != i) {
          exchange A[i] <-> A[largest]
          Heapify(A, largest)
       }
    }
    

    MaxHeapify的Java实现

    MaxHeapify( int[ ] arr, int i )
    {
        int left = 2 * i + 1;
        int right = 2 * i + 2;
        int largest = i;
    
        if( left < arr.length && arr[ left ] > arr[ largest ] )
            largest = left;
        if( right < arr.length && arr[ right ] > arr[ largest ] )
            largest = right;
        if( largest != i )
        {
            int temp = arr[ i ];
            arr[ i ] = arr[ largest ];
            arr[ largest ] = temp;
            MaxHeapify( arr, largest );
        }
    }
    

    Here是算法的动画。

    【讨论】:

      猜你喜欢
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 2021-11-02
      • 2015-01-14
      相关资源
      最近更新 更多