JS实现堆排序
来源:互联网 发布:数控加工及编程 编辑:程序博客网 时间:2024/06/06 15:01
【概念】
堆是一棵顺序存储的完全二叉树。
堆排序分为两种:
1)大根堆:所有的叶子不大于根。Ri >= R2i+1 且 Ri >= R2i+2 (大根堆)
2)小根堆:所有的叶子不小于根。Ri <= R2i+1 且 Ri <= R2i+2 (小根堆)
其中i=1,2,…,n/2向下取整;
当前节点为R[i],左孩子是R[2*i+1],右孩子是R[2*i+2]。父结点是R[(i-1)/2]。
【思想】
(1)根据初始数组去构造初始堆(构建一个完全二叉树,保证所有的父结点都比它的孩子结点数值大)。
(2)每次交换第一个和最后一个元素,输出最后一个元素(最大值),然后把剩下元素重新调整为大根堆。
【例子】以建立大根堆为例
建立了堆之后,每次都是从数组的len/2的位置开始,比较下标为[len/2-1]的结点和他的孩子之间的关系,找到最大的,交换到根结点的位置,然后依次向前推一个。
1,3,4,5,2,6,9,7,8,0有10个数,10/2=5,那么从下标为[4]的结点开始比较,R[2]=2,比较2和和她的孩子0,根结点已经是最大了,不操作。
比较R[3]=5和她的孩子7、8,发现5比8小,互换。
比较R[2]=4和她的孩子6、9,发现9比4大,互换。再向前推一个。
比较R[1]=3和她的孩子8、2,发现8比3大,互换。3和下面的孩子7、5比较,交换7和3,此时得到大根堆。
比较R[0]=1和她的孩子8、9,发现9比1大,互换。
此时二叉树中根=9是根堆。
<!DOCTYPE html><html><head><title>Heap Sort</title><meta charset="utf-8"/><script type="text/javascript">function heapSort(array){console.time("time");if(Object.prototype.toString.call(array).slice(8,-1)==='Array'){var heapSize = array.length,temp;//建立堆for(var i =Math.floor(heapSize /2)-1; i>=0; i--){heapify(array,i,heapSize);}for(var j=heapSize-1;j>=1;j--){temp = array[0];array[0]=array[j];array[j]=temp;heapify(array,0,--heapSize);}console.timeEnd("use time");return array;}else{return 'array is not an Array!';}}function heapify(arr,x,len){if(Object.prototype.toString.call(arr).slice(8,-1)==='Array'&&typeof x === 'number'){var l=1*x+1,r=2*x+2,largest = x,temp;if(l<len && arr[l] > arr[largest]){largest =l;}if(r<len && arr[r]> arr[largest]){largest =r;}if(largest!=x){temp = arr[x];arr[x]=arr[largest];arr[largest]=temp;heapify(arr,largest,len);}}else{return 'arr is not an Array or x is not a number'}}var arr=[91,60,96,13,35];document.write(heapSort(arr));</script></head><body></body></html>
阅读全文
0 0
- JS实现堆排序
- JS实现堆排序
- 堆排序的JS实现
- 了解堆排序并用js实现
- 【排序】堆排序实现
- 用堆实现堆排序
- Python实现 [堆] [堆排序]
- 最大堆实现堆排序
- 堆以及堆排序实现
- 堆实现 及 堆排序
- 最大堆实现堆排序
- 堆排序的实现
- 堆排序的实现
- 堆排序实现...
- 堆排序的实现
- 堆排序实现
- 堆排序算法实现
- 堆排序的实现
- Sift算子特征点提取、描述及匹配全流程解析
- Linux安装jdk和docker安装jdk
- JS url参数获取及汉字解码
- 南华OJ 重排串
- 文章标题
- JS实现堆排序
- git常用命令--简单易懂哈哈
- 图的实现(一)-邻接矩阵和邻接表
- Spark概述、Spark特点
- merge与update区别
- 人物介绍(二)
- clone 深复制与浅复制 讲的很清晰
- Android实现监听来电,并显示提示框
- 从零开始学Python第一天