js 實現堆排序

前端張小明發表於2020-03-03
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))複製程式碼


相關文章