堆排序 js完成
/* 近来 在看c言语版的数据结构,c用法实在很难,因而根据意义,模仿c言语写了javascript版的三种排序要领!仅供人人一同进修和参考
后续比较难的合并排序,和疾速排序,今后再说 ,空话不说,直接边代码边解说!*/
<script type="text/javascript">
var a=[0,9,8,7,6,5,4,3,2,1];
/*希尔排序,
将表分为几段长度,离别举行排序,然后举行总的排序*/
function shellSort(t)
{
var i,j,temp;
var increment=t.length;
do
{
//取到希尔腾跃 因为js取到的是浮点数,我们要把它转化成不大于该值得整数
increment=Math.floor(increment/3+1);
for(i=increment;i<t.length;i++)//轮回方便increment到t.length的值
{
if(t[i]<t[i-increment]){//前面值大于背面值 则将t[i]插进去有序增量子表
temp=t[i];//先将小的数值存储
for(j=i-increment;j>=0&&temp<t[j];j-=increment){//跳值方便前面的数值,将比找到的这个小的值大的值往后移
t[j+increment]=t[j];//不停挪动,找到这个temp应当插进去的位置
}
t[j+increment]=temp;//插进去该位置!
}
}
}
while(increment>1)
}
/*
js版插进去排序
形如我们打扑克一样,先取到的扑克牌(数字)作为规范,然后拿到下一个扑克牌(数字),比对前面的数字,将它插进去到比前面的扑克牌大,
比背面的数值小的位置,因为前面已经是有序的,只须要从后往前遍历,把比它大的递次后移一名,空出位置,插到空位
*/
function insert(l){
var temp,len=l.length;
for(var i=1;i<len;i++){//以第一个为基准,遍历今后的举行插进去
if(l[i]<l[i-1]){//当当前数字 小于前一个,就把前面的数字比当前l[j]大的向后挪动挪动一名;空出末了一个比l[j]大的位置
temp=l[i];
for(var j=i-1;j>=0&&l[j]>temp;j--){
l[j+1]=l[j];
}
l[j+1]=temp;//插到准确位置!此时j指针又向后挪动了一名,才跳出轮回,所以须要j+1;
}
}
}
/*
堆排序:道理是,将数组算作一个完整二叉树;
形如: 0
1 2
3 4 5 6
7 8 9 10
只须要遍历一半的值,举行轮回比对,把最大的节点赋值到根的位置,然后把根部的值和末了一个数值交流,消除末了一个数值
继承打造大顶堆,终究构成一个小顶堆的算法!
组织堆排序 s为最小值,m为最大值
*/
function HeapAdjust(l,s,m){//运用调解大顶堆举行排序,将s到m之间的数值调解为大顶堆!
var temp=l[s];//将大顶堆顶值负值给temp;
for(var j=2*s+1;j<m;j=2*j+1)//因为下标是0;这里只从0,1,3,5...每列的第一个数字最先方便就行
{
if(j<m&&l[j]<l[j+1])//假如当前下标的值比下一个下标的数值比下一个小(我们是要找最大的谁人),则就使j+1指向谁人数字
++j;
if(temp>=l[j])//假如堆顶的值大于当前j下标的值,就不必再找了。跳出轮回
break;
l[s]=l[j];//小于j下标的值,就把l[j]复制给l[s]
s=j;//s就指向当前j的位置,为下步把顶值赋值到这个位置做准备(轮回完之前,先不赋值)
}
l[s]=temp;//末了赋值给l[s](s指向如今找到的最大的大堆顶的值)
}
function HeapSort(l)
{
for(var i=l.length/2;i>=0;i--)//起首组织一个规范的大堆顶,只须要方便二叉树一半的节点,就可以把大堆顶组织出来
HeapAdjust(l,i,l.length);
for(var i=l.length;i>0;i--){//组织完以后 把堆顶的值和末了一个交换,然后 消除末了一个继承举行打造大堆顶!
swap(l,0,i-1);
HeapAdjust(l,0,i-2);
}
}
function swap(l,i,j){
var temp=l[i];
l[i]=l[j];
l[j]=temp;
}
shellSort(a);
//insert(a);
console.log(a);
</script>