资讯专栏INFORMATION COLUMN

排序算法——JS算法实现

tianlai / 1853人阅读

摘要:待排序的记录序列中可能存在两个或两个以上的关键字相等的记录,且在排序前在前面即,若在排序后的序列中任然在前面,则称所用的排序算法是稳定的。基数排序留各种排序算法比较以上用到的函数函数返回生成的数组结束

排序 Sorting 排序基本概念

排序是计算机程序设计中的一种重要操作,他的功能是将一个数据元素(或记录)的任意排列,重新排列成一个按关键字有序的序列。
待排序的记录序列中可能存在两个或两个以上的关键字相等的记录,且在排序前Ri在Rj前面(即i是稳定的。

如果按照排序过程中依据的不同原则对内部排序进行分类,则可分为

插入排序

交换排序(快速排序)

选择排序

归并排序

基数排序

如果按照工作量来区分可以分为3类

简单的排序算法,时间复杂度为O(n2)

先进的排序算法,时间复杂度为O(nlogn)

基数排序,时间复杂度为O(d*n)

通常,在排序的过程中需要进行下列两种基本操作,(其中第二种操作可以通过改变记录的存储方式来予以避免)

比较两个关键字大小

将记录从一个位置移动至另一个位置
待排序的记录序列可有下列3种存储方式。

存储在地址连续的一组存储单元上。

静态链表,记录之间的次序由指针指示,则实现排序不需要移动记录

待排序记录存储在一组地址连续的存储单元内,同时,另外设一个指示各个记录存储位置的地址向量,在排序过程中不移动记录本身,而是移动地址向量
中这些记录的“地址”,在排序结束后再按照地址向量中的值调整记录的存储位置。

插入排序 直接插入排序 O(n2)

最为简单的一种排序,基本操作为将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录增1的有序表。

//直接插入排序,更为高效的应该是折半插入排序¬≥
function insertSort (Arr) {
  if (Arr.length <= 1) {
    return Arr;
  }
  var temp;

  for (var i = 1; i < Arr.length; i++) { //从1开始,第一个不用排序
    temp = Arr[i]; //用temp缓存待插入的元素
    for (var j = i; j >= 0; j--) {
      if (temp < Arr[j]) {
        Arr[j + 1] = Arr[j]; //当Arr[i] Arr[j]) {
        break; //第一种:如果找到了一个比Arr[i]小的Arr[j],则退出循环,结束
      }
      //第二种,当j循环,结束
    }
    //结束j循环,将temp中缓存的待插入元素插入
    Arr[j + 1] = temp;
  }

}; //insert结束
其他插入排序

折半插入排序 O(n2) 通过减少比较关键字大小次数来优化排序算法。

2路插入排序

表插入排序

希尔排序 O(n3/2)

又被称为"缩小增量排序"。基本思想:先将整个待排记录序列分割成若干个子序列分别进行直接插入排序,待整个序列中的记录
“基本有序”时,再对全体记录进行一次直接插入排序。

function shellSort(Arr) {
  var gap = Math.floor(Arr.length / 2);
  while (gap > 0) {
    for (var i = 0; i < Arr.length; i++) {
      var temp = Arr[i];
      for (var j = i; j >= gap && Arr[j - gap] > temp; j -= gap) {
        Arr[j] = Arr[j - gap];
      }
      Arr[j] = temp;
    }
    gap = Math.floor(gap / 2);
  }
  return Arr;
}; //shell结束
快速排序 起泡排序 bubble sort
// 起泡排序,
function bibbleSort(Arr) {
  for (var i = Arr.length - 1; i >= 0; i--) {
    for (var j = 0; j < i; j++) {
      if (Arr[j] > Arr[j + 1]) {
        swap(j, j + 1, Arr);
      }
    }
  }
  return Arr;
};
快速排序 quick sort
// 一趟快速排序的算法是
// 1.设置初始值x=0,y=n-1,令keyValuey=Arr[0],2.从Arr[y]开始向前遍历,如果keyValue>Arr[y],则将Arr[i]和Arr[y]交换,3.从Arr[x]向后遍历,当keyValue
选择排序
简单的选择排序
//选择排序 从待排序的数组中找出最小值放在最前面
function selectSort(Arr) {
  for (var i = 0; i < Arr.length; i++) {
    for (var j = i; j < Arr.length; j++) {
      if (Arr[i] > Arr[j]) {
        swap(Arr, i, j);
      }
    }
  }
  return Arr;
}; //select结束
树形选择排序

堆排序 heap sort

留!!!

归并排序 merging sort O(m+n)

假设初始序列含义n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,等到Math.floor(n/2)个长度为2或1的有序子序列,再两两归并,如此重复,直至得到一个长度为n的有序序列为止。

function mergeSort (){
    var merge=function(left,right){
        var final=[];
        while(left.length&&right.length){
            final.push(left[0]<=right[0]?left.shift():right.shift());
        }
        return final.concat(left.concat(right));
    };

    var len=this.length;
    if(len<2){
        return this;
    }

    var mid=parseInt(len/2),
        _left=this.slice(0,mid),
        _right=this.slice(mid);
    return merge(_left.mergeSort(),_right.mergeSort());
};
基数排序 radix Sorting

各种排序算法比较 以上用到的swap函数
//swap函数
function swap(Arr, firPos, secPos) {
  var temp = Arr[firPos];
  Arr[firPos] = Arr[secPos];
  Arr[secPos] = temp;
  return Arr; //返回生成的数组
} //swap结束

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/91630.html

相关文章

  • 使用JS实现三种基本的排序算法以及三种算法的比较

    摘要:介绍排序算法是算法中最常见的算法之一,我这里要介绍的是排序算法中的三种基本算法冒泡排序选择排序插入排序,在文章的后面我会对三种算法的速度进行对比。 1.介绍 排序算法是算法中最常见的算法之一,我这里要介绍的是排序算法中的三种基本算法:冒泡排序、选择排序、插入排序,在文章的后面我会对三种算法的速度进行对比。 2.冒泡排序 冒泡排序其名来源与其算法实现,会使得数组中的元素一个个从数组一端漂...

    wh469012917 评论0 收藏0
  • 排序算法分析总结(附js实现

    摘要:本文对一些排序算法进行了简单分析,并给出了的代码实现。平均时间复杂度不好分析,它是冒泡排序是稳定的排序算法。冒泡排序是原地排序算法原地排序指的是空间复杂度是的排序算法。归并排序,会将数组从中间分成左右两部分。 本文对一些排序算法进行了简单分析,并给出了 javascript 的代码实现。因为本文包含了大量的排序算法,所以分析不会非常详细,适合有对排序算法有一定了解的同学。本文内容其实不...

    liaoyg8023 评论0 收藏0
  • JS数据结构与算法_排序和搜索算法

    摘要:上一篇数据结构与算法树写在前面这是学习数据结构与算法的最后一篇博客,也是在面试中常常会被问到的一部分内容排序和搜索。 上一篇:JS数据结构与算法_树 写在前面 这是《学习JavaScript数据结构与算法》的最后一篇博客,也是在面试中常常会被问到的一部分内容:排序和搜索。在这篇博客之前,我每每看到排序头就是大的,心里想着类似冒泡排序,两层遍历啪啪啪就完事了,然后再也无心去深入研究排序相...

    姘搁『 评论0 收藏0
  • JS中可能用得到的全部的排序算法

    本篇有7k+字, 系统梳理了js中常见的12种排序算法。除了基本排序算法,文章还包含了希尔排序、堆排序、桶排序等较为复杂的排序实现,如果喜欢请点赞支持~谢谢. 原文: http://louiszhai.github.io/20... 导读 排序算法可以称得上是我的盲点, 曾几何时当我知道Chrome的Array.prototype.sort使用了快速排序时, 我的内心是奔溃的(啥是快排, 我只知道...

    verano 评论0 收藏0

发表评论

0条评论

tianlai

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<