标签:调整 倒数 bsp 堆排序 java 堆排 bre 实现 sort
基本过程
1.将无序数组转换为一个大顶堆
2.将大顶堆的顶部元素与数组的最后一个元素交换
3.将交换后的堆调整为一个大顶堆
4.将堆顶与数组倒数第二个元素交换
5.重复以上过程,直至堆中只有一个元素
堆排序实际上也是一种选择排序,只是从前面的元素中选取最大元素的方法是使用堆选取,
比直接比较选取节省比较次数。
javascript实现
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; }
标签:调整 倒数 bsp 堆排序 java 堆排 bre 实现 sort
原文地址:http://www.cnblogs.com/mengff/p/6160874.html