堆排序js实现

代小代 代小代     2022-07-31     634

关键词:

/* 最近 在看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>

 

排序算法:堆排序-java实现

排序算法(二):堆排序-Java实现首先对堆排序有个整体的认识,堆排序是一个不稳定的排序算法,其平均时间复杂度为O(nlogn),空间复杂度O(1)。那么何为堆排序呢?所谓堆排序是借助于堆的概念来完成的排序算法,其是选择排序中... 查看详情

链式结构实现堆排序

在很多数据结构和算法的书上,“堆排序”的实现都是建立在数组上,数组能够通过下标访问其元素,其这一特性在堆排序的实现上,使得其编码实现比链式结构简单,下面我利用链表实现堆排序。在“堆”这种数据结构中,分... 查看详情

堆排序的简单实现

堆排序是排序的一种,一般有大根对和小根堆之说,大根对,根节点的值比左右子树的根节点的值要大。建堆我们一般是一个完全二叉树。堆排序一般面向数据量比较大的时候,数据量比较小的时候,不适合使用堆排序,比如有... 查看详情

排序--08---堆排序(代码片段)

文章目录堆排序需求:实现步骤:API设计:堆构造过程树--07---堆的实现因为堆数组中的一半是叶子节点,一半是非叶子节点.堆数组中最大索引处的父节点,就是最后一个非叶子节点图解流程:代码实现堆排序过程排序流程:图... 查看详情

java实现堆排序和计数排序

堆排序代码:importjava.util.Arrays;/***思路:首先要知道大顶堆和小顶堆,数组就是一个堆,每个i节点的左右孩子是2i+1和2i+2*有了堆,将其堆化:从(n/2)-1个元素开始向下修复,将每个节点修复为小(大)顶堆*修复完成后,数组具有... 查看详情

堆排序及java版实现(代码片段)

堆排序特点原地排序时间复杂度O(nlogn)步骤构造堆排序堆排序的关键就是借助“堆”这个数据结构对元素进行排序,下面简单介绍一下堆。堆定义堆是一棵完全二叉树堆中每一个节点的值都必须大于等于其子树每个节点的值&#... 查看详情

堆排序实现

1、堆排序算法描写叙述:(1)定义n个keyword序列Kl,K2,…,Kn称为(Heap)。当且仅当该序列满足例如以下性质(简称为堆性质):1)ki<=k(2i)且ki<=k(2i+1)(1≤i≤n/2)。当然。这是小根堆。大根堆则换成>=号。//k(i)相当... 查看详情

堆排序

堆排序:大堆排序就是将最大的数先进行排序,然后对剩下依次排序,自到堆里无未排序数据为止,小堆排序,恰好相反,用二叉树进行实现,具体代码如下:、packagecom.qdcz.breadth.demo;/****<p>Title:HeapA</p>*<p>Description:... 查看详情

java实现堆排序

publicclassHeapSortimplementsSortAlgorithm{@Overridepublicvoidsort(int[]nums){if(nums==null||nums.length==0)return;//构建最大堆buildMaxHeap(nums);intheapSize=nums.length;while(heapSize>1){//交换堆顶和堆尾的两个元素 查看详情

数据结构与算法堆排序总结与实现(代码片段)

本博客总结学习堆排序算法,以一个数组为例,采用大根堆进行升序排序,附有代码实现。堆排序的思想堆排序的逻辑是建立在完全二叉树的基础上。有两个概念必须要了解:大根堆:每个结点值都大于等于左右孩子结点值小根... 查看详情

堆排序最大堆最小堆java实现

堆排序啊,其实是一种数据结构,二叉树,二叉树分为是满二叉树和完全二叉树。一棵深度为k,且有2k-1个节点称之为满二叉树,完全二叉树:深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中序号... 查看详情

堆排序分析(javascript代码实现)

堆排序的时间复杂度是O(nlgn),与归并排序一样,但它又与插入排序一样具有空间原址性:任何时候都只需要常数个额外的元素空间存储临时数据。什么是堆?一般堆用数组存储,表现出近似完全二叉树形式,树上的每一个结点... 查看详情

堆排序及代码实现

这几天有点抵触情绪,看过了快速排序还有一些别的东西,但是一点都不想写有点复杂的代码00拖到了今天终于写了前几天就应该自己写一下的堆排序,完全用C语言写的,下面把代码贴一下。很多地方写得并不好,不过已经经过... 查看详情

c语言试题179之实现堆排序算法

查看详情

c语言试题179之实现堆排序算法

查看详情

选择排序——2堆排序实现

...索引值,如数组中第1个数对应的N为0。**参数说明:*a--待排序的数组*start--被下调节点的起始位置(一般为0,表示从第1个开始)*end--截至范围(一般为数组中最后一个元素的索引)*/privatevoidmaxHeapDown(int[]a, 查看详情

python实现堆和堆排序(代码片段)

"""堆是一种完全二叉树,有最大堆和最小堆两种。最大堆:对于每个非叶子结点V,V的值都比它的两个孩子结点大,称为最大堆特性(heaporderproperty),最大堆里面的根总是储存最大值,最小值储存在叶子结点。最小堆:和最大堆相... 查看详情

java 堆排序实现

堆排序啊,其实是一种数据结构,二叉树,二叉树分为是满二叉树和完全二叉树。一棵深度为k,且有2k-1个节点称之为满二叉树,完全二叉树:深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中序号... 查看详情