堆 排 序 html
堆排序。就是经过堆结构来排序。能够看以前写的http://www.cnblogs.com/robsann/p/7521812.html 。关于堆的结构java
堆排序先要使结构堆有序。因此要先使全部的小堆有序,小堆一点一点加入先的元素。最后整个堆有序。解图。假设你有git
以下数组对象github
[ 2 ][ 4 ] [ 5 ] [ 11 ][ 0 ] [ 7 ] [ 8 ]变成堆的样子就是 数组
如今这个堆是无序的。首先要让堆变得有序。性能
咱们先把右边这个子数变得有序(加深颜色的那个树)。ui
再把左边那个子数也变的有序.以下 因此2 11为root的数 和 8 为root的数是已经堆有序了。接着咱们再把2为root的树变得有序spa
最后变成以下的样子。htm
如今咱们知道11是最大的,咱们能够很轻松的把11放在数组最末尾的位置表面11是最大的,11 已经排好了位置。对象
接下来咱们就能够不用管11了。由于11是全部数里面最大的,并且已经找到了本身的位置。
如今的有序被破坏了。因此咱们必须再次让堆有序。变成以下
这个时候天然而然就能够知道8是 除 11外最大的数。 全部把8放到数组末尾第二个位置
一直进行这样子的操做,就能够排序数组了。
分析
虽然堆排序的Time proportional to NLg(N) 可是由于堆的比较次数不少,性能不及QuickSort和megeSort
代码
https://github.com/Cheemion/algorithms/blob/master/src/com/algorithms/sort/HeapSort.java