1. 程式人生 > >終於弄懂堆排序

終於弄懂堆排序

var arr = [3,5,1,6,4,7,2];

function swap(array,x,y) {
    var temp = array[x];
    array[x] = array[y];
    array[y] = temp;
}
function buildHeap(array,heapSize) {//構建大頂堆
    var i = Math.floor(heapSize / 2);
    for(;i >=0;i--) {
        heapify(array,heapSize,i);
    }
}

function heapify(array,heapSize,i) {//調整大頂堆
    var left = 2 * i + 1,
        right = 2 * i + 2,
        largest = i;
    if(left < heapSize && array[left] > array[largest]){
        largest = left;
    }

    if(right < heapSize && array[right] > array[largest]) {
        largest = right;
    }

    if(largest != i) {
        swap(array,largest,i);
        heapify(array,heapSize,largest);//繼續交換當前剩餘的節點
    }
}
function heapSort(array) {
    var heapSize = array.length;
    //第一步構建一個大頂堆
    buildHeap(array,heapSize);//構建一個大頂堆

    while(heapSize > 1) {
        heapSize--;
        swap(array,0,heapSize);//始終交換陣列第一個跟最後一個元素
        heapify(array,heapSize,0);//調整為大頂對,使陣列的第一個元素保持是最大的。
    }
}
heapSort(arr);