var arr = [49,38,65,97,76,13,27,49]
// 先寫堆調整的篩選
function heapAdjust(arr, x, length) {
var left = 2*x+1;
var right = 2*x+2;
var smallest = x;// 儲存最小元素的座標
var temp
if(left < length && arr[left] < arr[smallest]){
smallest = left
}
if(right < length && arr[right] < arr[smallest]){
smallest = right
}
if(smallest !== x) {
temp = arr[x];
arr[x] = arr[smallest];
arr[smallest] = temp ;
heapAdjust(arr,smallest,length)
}
}
// 建堆
/** 無序堆 從第n/2個元素開始依次到第1個元素
* 也就是說下標看就是從(arr.length)/2-1 到 第0個元素 的節點為跟的子樹進行調整堆 一直到下標為0 的元素 有序堆建立好了
* */
function heapSort(arr) {
let length = arr.length
for (let i = (arr.length)/2 -1 ; i >= 0; i--) {
heapAdjust(arr,i,arr.length)
}
console.log('建堆', arr)
var temp
// 堆排序 以小根堆為例 堆建好之後 堆頂就是最小的元素了
/*
* 1. 輸出堆頂元素之後,以堆中最後一個元素(編號最大的元素)代替它 也就是把最後面的元素拿到堆頂
* 2.然後進行堆調整 '篩選'( 將根節點值與左右孩子值比較,並與其中小者進行交換,重複上述操作直到葉子節點)
* */
for (let j = arr.length-1; j >= 1; j--) {
temp = arr[0];
arr[0] = arr[j];
arr[j] = temp ;
heapAdjust(arr,0,--length)
}
return arr;
}
console.log('堆排序', heapSort(arr))複製程式碼