<script type="text/javascript">
function swap(arr,i,j){
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
/**
* 堆排序原理:
* 构造大顶堆是为了找出当前长度为len的数组中最大的值并放置到根节点
* 然后通过将根节点中的最大值放到最后一个节点中,此时数组长度变为len-1(即忽略最大值),
* 重复上述步骤直到len=1
* (当然,数组长度len只是我用来表示这一变化过程的工具,实际操作中这里并没有用到)
*/ ,
/**
* 筛选原理:
* 问:如何构造大顶堆?答:以局部构造整体,由下往上堆积最大值,
* 也就是从后面开始遍历节点,保证能够让父节点始终大于子节点,
* 旁系关系则不需要计较,则最顶部的父节点必然是最大值。
*/
// 父节点获取子节点下标 leftChild = parent*2+1; rightChild = parent*2+2;
// 子节点获取父节点下标 parent = Math.floor((child-1)/2)
// 左节点下标为偶数,右节点下标为奇数
// 思考: 上溯还是下溯?
// 答:选择上溯,子节点间推举出最大值往上堆积
// 通过构造大顶堆筛选出最大值放到根节点
function sift(arr,child){
if(child == 0) return;
var parent = Math.floor((child-1)/2);
if(arr[child] > arr[parent]){
swap(arr, child, parent);
}
sift(arr, child-1);
}
// 堆排序
function largeHeapSort(arr){
var end = arr.length-1;
// 从下往上开始遍历节点
for(var i = arr.length-1; i > 0; i--){
sift(arr, i);
swap(arr, 0, end--)
}
}
var arr = [7,5,8,42,1,99,85,36,6]
largeHeapSort(arr)
console.log(arr)
</script>
js堆排序简解
最新推荐文章于 2023-12-04 14:22:29 发布