排序算法堆排序 (算法导论学习)

Posted 作死的跑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法堆排序 (算法导论学习)相关的知识,希望对你有一定的参考价值。

堆排序算法

1.将排序数组用二叉树堆进行表示
  1. 设置数组

    a = [16|14|10|8|7|9|3|2|4|1]

  2. 展现出一个最大堆

                  [16]
         [14]          [10]
     [8]     [7]     [9]   [3]
  [2]  [4]  [1]


private int parent(i){
   return i/2;
}

private int left(i){
   return 2i;
}

private int right(i){
   return 2i+1;
}

2.维护堆的属性(最大堆、最小堆)
  1. 维护堆 如果子节点比父节点大则进行交互,保证父节点大于子节点

private void maxHeapify(int[] a,int i,int heapSize){
   int left = left(i);
   int right = right(i);
   int largest;
   if (left <= heapSize && a[left] > a[i]){
       largest = l;
   } else {
       largest = i;
   }
   if (right <= heapSize && a[right] > a[largest]){
       largest = r;
   }
   if (largest != i) {
       int t = a[i];
       a[i] = a[largest];
       a[largest] = t;
       maxHeapify(a,largest);
   }
}
3.建堆
  1. 可以用自底向上的方法利用方法maxHeapify()把大小为n=a.lenght的数组a[1..n]转换为最大堆

  2. 子数组a[n/2+1...n]中的元素都为叶子节点建堆过程如下

    private void buildMaxHeap(int[] a,int heapSize){
       for (int i = a.lenght/2;i >= 0;i--){
           maxHeapify(a,i,heapSize);
       }
    }
4.堆排序
  1. 堆中的a[1]的元素总是堆中的最大值通过它与a[n]进行互换我们就可以让改元素放正确位置

  2. 每次从跟节点往下搜索将最大元素替换到跟节点上

    private void heapSort(int[] a){
       int heapSize = a.lenght - 1
       buildMaxHeap(a,heapSize);
       for (int i = a.lenght - 1;i >= 1;i++){
           exhange a[1] with a[i];
           heapSize = a.heapSize -1;
           maxHeapify(a,0,heapSize)
       }
    }


以上是关于排序算法堆排序 (算法导论学习)的主要内容,如果未能解决你的问题,请参考以下文章

算法排序之堆排序

算法导论习题—堆排序快速排序

算法导论笔记——第六七章 堆排序和快速排序

[算法导论]#6 堆排序

算法导论笔记第6章 堆和堆排序

《算法导论(CLRS)》骨灰级笔记分享:堆排序Heapsort