堆排序
Posted 等风来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆排序相关的知识,希望对你有一定的参考价值。
基本过程
1.将无序数组转换为一个大顶堆
2.将大顶堆的顶部元素与数组的最后一个元素交换
3.将交换后的堆调整为一个大顶堆
4.将堆顶与数组倒数第二个元素交换
5.重复以上过程,直至堆中只有一个元素
堆排序实际上也是一种选择排序,只是从前面的元素中选取最大元素的方法是使用堆选取,
比直接比较选取节省比较次数。
function fHeapSort(arr){ //构建初始堆,将无序数组转化为堆 var len = arr.length; for(var i=len/2 -1;i >=0;i--){ fAdjustHeap(arr,i,len); } for(var i=len-1;i>0;i--){ //将堆顶与数组的第i个元素交换 var temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; //交换后,重新构造大顶堆 fAdjustHeap(arr,0,i); } } function fAdjustHeap(arr,nParent,len){ //从父节点,左孩子,右孩子三个节点中选取最大者,与父节点交换, //对于子节点非孩子节点,与父节点交换后,其自身的大顶堆可能被破坏, //需要向下继续调整,直至到达堆边界,即叶子节点 var temp = arr[nParent]; var nChild = 2 * nParent + 1; while(nChild < len){ //nChild + 1为右侧孩子节点,若右孩子大,则选择它 if(nChild + 1 < length && arr[nChild] < arr[nChild + 1]){ nChild++; } //若父节点大,则无需交换 if(temp >= arr[nChild]){ break; } //将大孩子赋值给父节点 arr[nParent] = arr[nChild]; nParent = nChild; //索引向叶子节点前进 nChild = 2 * nParent + 1; } arr[nParent] = temp; }
以上是关于堆排序的主要内容,如果未能解决你的问题,请参考以下文章