HeapSort
- 堆排序
<script type="text/javascript">
//堆是一种特殊的完全二叉树(使用的是二叉树的顺序存储结构):每个节点的值都大于等于孩子节点的是大顶对
//小于等于孩子节点的是小顶对
//排序的思想:将待排的序列构成一个大顶堆,此时把最大值是根节点;
//把根节点和最后一个元素交换;然后用剩下的n-1个元素继续构建大顶堆,
//然后继续交换
//时间复杂度:HeapAdjust()最多执行次数为MAth.floor(LogN)+1次
//所以时间复杂度为 O(nlogn);
//空间复杂度:O(1)
//稳定性:不稳定
function HeapSort(obj)
{
//把待排序的序列构建成大顶推
for(var i=Math.floor(obj.length/2);i>0;i--)
{
HeapAdjust(obj,i,obj.length)
}
//交换根节点和最后一个元素的位置
for(var j=obj.length;j>1;j--)
{
swap(obj.data,1,j);
HeapAdjust(obj,1,j-1);//此处只要调整根节点即可
}
}
//构建大顶堆
//num代表构建大顶堆的元素的个数
//s代表有孩子的节点
function HeapAdjust(obj,s,num)
{
var temp=obj.data[s];
//j<==num;表示当前结点有孩子
for(var j=2*s;j<=num;j*=2)
{
//j<num表示当前节点的两个孩子都存在
if(j<num && obj.data[j]<obj.data[j+1])
j=j+1;
if(temp<obj.data[j])
{
obj.data[s]=obj.data[j]
s=j;
}else{
break;
}
}
obj.data[s]=temp;
}
//交换数组中两个数的位置
function swap(arr,i,j)
{
var temp;
temp=arr[j];
arr[j]=arr[i];
arr[i]=temp;
}
var obj={
data:[0,3,10,5,11,4,8,9,5],
length:8
};
HeapSort(obj);
console.log(obj.data);
</script>