堆排序

堆排序

  堆排序是指利用堆这种数据结构所设计的一种排序算法。近似于完全二叉树,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。它的时间复杂度是O(nlog2(n)),空间复杂度是O(1),其算法不稳定。

var length;//因为声明的多个函数都需要数据长度,所以把len设置成为全局变量
//建立大顶堆
function buildMaxHead(arr) {
    length = arr.length;
    for (var i = parseInt(length/2); i>=0; i--) {
        heapify(arr,i);
    }
}
//堆调整
function heapify(arr,i) {
    var left = 2*i+1;
    var right = 2*i+2;
    var largest = i;
    if(left<length&&arr[left]>arr[largest]){
        largest = left;
    }
    if(right<length&&arr[right]>arr[largest]){
        largest = right;
    }
    if(largest!=i){
        swap(arr,i,largest);
        heapify(arr,largest);
    }
}
//交换两个数
function swap(arr,i,j) {
    var temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}
//堆排序
function heapSort(arr) {
    buildMaxHead(arr);
    for ( var i = arr.length-1; i >0; i--) {
        //console.log(arr);
        swap(arr,0,i);
        length--;
        heapify(arr,0);
    }
    return arr;
}
console.log(heapSort([10,3,5,6,2,7,9,4,0,2,5]));
posted @ 2021-12-23 17:05  秋墨江雪  阅读(25)  评论(0编辑  收藏  举报