堆排序 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>
时间: 2024-12-06 17:38:37

堆排序 js实现的相关文章

js实现堆排序

二叉树:数据结构的一种.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.一棵深度为k,且有2^k-1个节点称之为满二叉树:深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为完全二叉树. 堆实质上是完全二叉树,必须满足:树中任一非叶子结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字. 堆分为:大根堆和小根堆,升序排序采用大根堆,降序排序采用小根堆. 堆排序原理: 利用大顶堆(小

js算法初窥02(排序算法02-归并、快速以及堆排序)

上一篇,我们讲述了一些简单的排序算法,其实说到底,在前端的职业生涯中,不涉及node.不涉及后台的情况下,我目前还真的没想到有哪些地方可以用到这些数据结构和算法,但是我在前面的文章也说过了.或许你用不到,但是,真的,如果你想要在前端领域有一个不错的发展.数据结构和算法一定是你的必修课.它不仅仅让你在处理问题的时候可以有一个思维底蕴,更重要的是,在遇到一些奇葩产品的时候,你可以和他PK到底!嗯,到底! 哈哈,开个小玩笑.咱们还是聊点有营养的.上一篇的算法比较简单,主内容就是循环,次内容就是比较.但

堆排序原理及其js实现

图文来源:https://www.cnblogs.com/chengxiao/p/6129630.html 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序.首先简单了解下堆结构.堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序.首先简单了解下堆结构. 堆 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩

js 数组排序和算法排序

1.算法排序 a.插入排序 var arr = [23,34,3,4,23,44,333,444]; var arrShow = (function insertionSort(array){ if(Object.prototype.toString.call(array).slice(8,-1) ==='Array'){ for (var i = 1; i < array.length; i++) { var key = array[i]; var j = i - 1; while (j >

[Node.js] 闭包和高阶函数

原文地址:http://www.moye.me/2014/12/29/closure_higher-order-function/ 引子 最近发现一个问题:一部分写JS的人,其实对于函数式编程的概念并不是太了解.如下的代码片断,常常让他们觉得不可思议: OAuth2Server.prototype.authCodeGrant = function (check) { var self = this; return function (req, res, next) { new AuthCodeG

八大排序算法JS及PHP代码实现

从学习数据结构开始就接触各种算法基础,但是自从应付完考试之后就再也没有练习过,当在开发的时候也是什么时候使用什么时候去查一下,现在在学习JavaScript,趁这个时间再把各种基础算法整理一遍,分别以JS和PHP语法的方式编写代码. 1.冒泡排序 原理:临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束 时间复杂度:平均情况:O(n2)  最好情况:O(n) 最坏情况:O(n2)

js中的冒泡排序以及实现一个数组中得最到最大的数字小例

这其实是一个很简单的js就可以实现,当然一般情况就是利用for循环,从第一个跟第二个开始比较,根据大小交互位置,思路很简单. 也就是js中的冒泡排序 冒泡排序 时间复杂度为O(n^2),有两个优点: 1.“编程复杂度”很低,很容易写出代码: 2.具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,而堆排序.快速排序均不具有稳定性. 实现基本思路:冒泡排序是经过n-1趟子排序完成的,第i趟子排序从第1个数至第n-i个数,若第i个数比后一个数大(则升序,小则降序)则交换两数

js排序与重组

前几天同学发给我一个问题,思路想整理一下,也供大家参考.实际上这道题本质就是考察的是去重与排序的问题.好了闲话少说,上题. function input(req){     if(req<=100){      var arr=[],arr1=[];           for(var i=0;i<req;i++){             var num=parseInt(Math.random()*(1000-1)+1);              arr.push(num);      

堆排序的学习

几句废话先: 本人最近在学习研究数据结构和算法,之所以为什么学习它,第一:是我看到到了现在学习的瓶颈,一直停留在使用别人的什么什么框架或者算法之类的东西,没有对程序更深层次的学习探究.第二:想在IT行业走得更加的长远,数据结构是必须要迈的一道坎. 另外本人从上一篇博客开始已经步入javascript,不在或者很少探讨.NET平台相关内容. 主题: arr.heap-size 至于什么事堆,我在这里也不再的啰嗦,阅读本博文,已经默认你认识它,如果您是大牛,请忽视本博文或者找我的错,我很欢迎  :)