分為兩步,建堆與維持堆的性質,首先我們要先理解堆是什麼東西.
堆其實就是乙個完全二叉樹,我們可以使用順序表儲存乙個二叉樹,如下圖所示來儲存:
其中分為最大堆最小堆,而最大堆就是上頭大,下頭小;最小堆則反之.
明白了堆的定義我們就可以開始學習堆排序了,堆排序其實也是分為有序區與無序區,其中無序區就是我們建好的最大堆,根節點就是堆中最大的數,我們逐個讓最大元素進有序區並對堆結構進行調整,維持根節點最大的性質,直到堆中元素清空為止,就是堆排序的過程.
//工具函式
function swapitem(pre,next,arr)
function getleft(i)
function getright(i)
//維持堆的性質
function heapadjust(arr,i,len)else
if(r < len&&arr[r] > arr[large])
//上述**就是取節點也子節點三個元素之間的最大值
if(large !== i)
}//建堆
function heapbuild(arr,len)
}//堆排序本體如下
function heapsort(arr)
}//測試**
var arr=[91,60,96,13,35,65,46,65,10,30,20,31,77,81,22];
heapsort(arr);
console.log(arr);
演算法學習(三)堆排序
要弄清楚堆排序,我們首先要懂得以下兩點 1 邏輯上的結構,怎麼樣才是乙個堆。2 儲存上的結構,乙個堆儲存起來的結構是怎麼樣的。一般來講,堆排序中的 堆 指的是二叉堆,一種完全二叉樹的結構,每個父結點最多只有兩個子結點,且滿足兩點 1 父結點總是大於 小於 其兩個子結點 大於的,我們叫最大堆,小於的,...
排序演算法 三 堆排序
1.heap.class package cn.sort.heap 堆排序實現 公升序排序 author ly public class heap system.out.println 向下調整 先拿左右子樹進行比較,看誰比較大,然後再拿大的與父結點進行比較,若孩子結點比較大,則大孩子與父結點交換,...
排序之三 堆排序 可列印排序流程
public class heapsort public static heapsort getinstance return sinstance 堆排序演算法入口 param arr 建議使用個位數陣列測試方便直觀觀察排序過程 0 3 4 2 5 6 1 return 排序後陣列 public i...