声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢!

  本文为楼主自己的学习记录文章,若有不当之处请斧正。

  本文主要记录排序算法

  【冒泡排序】

  感觉这个是最简单的排序算法了。直接引用维基百科里的解释:

  冒泡排序算法的运作如下:比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

  原理相当容易理解:

  实现代码如下:

var array = [],maxNum = 100;

        for(var i=0;i<maxNum;i++){
array.push(parseInt(Math.random()*maxNum));
} console.log("排序前:"+array);
bubbleSort(array);
console.log("排序后:"+array); function bubbleSort(array){
var end = array.length-1;
while(end>0){
for(var i=0;i<end;i++){
if(array[i]>array[i+1]){
var md = array[i+1];
array[i+1] = array[i];
array[i] = md;
}
}
end--;
}
}

之后就不贴结果图了,都一样,= =反正都排的出来。

  【插入排序】

  插入排序算法大概原理:遍历数组,取两个相邻数据a和b,a数据之前的数据为有序区,b数据之后的为无序区。如果b大于a,继续往下遍历。如果b小于a,则把b跟有序区里的值按<-方向进行比对,比b大的数据索引均加一。当遍历到小于或等于b的数据时,那个位置就是b应该呆的位置。用维基百科上的一张图,就能秒懂了

   插入也挺容易理解的:

var array = [],maxNum = 100;

        for(var i=0;i<maxNum;i++){
array.push(parseInt(Math.random()*maxNum));
} console.log("排序前:"+array);
insertSort(array);
console.log("排序后:"+array); function insertSort(array){
for(var i=0;i<array.length;i++){
var a = i,b = i+1; if(array[a]>array[b]){
var j = b-1,ayb = array[b];
while(ayb<array[j]){
array[j+1] = array[j]
j--;
} array[j+1] = ayb;
}
}
}

  【希尔排序】

  希尔排序算法大概原理:遍历的方法跟插入排序差不多,不一样的就是希尔排序是先将数组分成多列,对每一列里的数据进行排序,然后对列数进行N/2操作,再进行逐列排序,直至列数为1时,数组即排列完毕。

var array = [],maxNum = 100;

        for(var i=0;i<maxNum;i++){
array.push(parseInt(Math.random()*maxNum));
} console.log("排序前:"+array);
shellSort(array ,10);
console.log("排序后:"+array); function shellSort(array , d){
// var d = d;
while(d>=1){
sort(array , d);
d = Math.floor(d/2)
}
} function sort(array , d){
var h = array.length/d;
for(var i=0;i<d;i++){
for(var j=0;j<h;j++){
var a = i+j*d , b=a+d; if(array[a]>array[b]){
var g = a,ayb = array[b];
while(ayb<array[g]){
array[g+d] = array[g]
g-=d;
}
array[g+d] = ayb;
}
}
}
}

  

  【快速排序】

  这个排序算法想了比较久,脑子没那么灵活,所以研究了好一会才弄懂原理。其实说白了就是取个key作为中间值,把比key大的数据扔右边,把比key小的扔左边,循环递归。

  再详细说下快速排序算法原理(我理解的):取数组的一个数据作为key,一般取第一个数据,然后进行遍历,将比key大的值扔在右边,把比key小的值扔在左边。遍历的方法:定义变量i、j,i为0,j为数组最后一个元素的索引。首先先从j到i方向开始遍历,i不动。即是<--方向,当遍历到的数据比key小且比array[i]的值小的时候,交换array[i]和array[j]的值。然后停止j向i的运动,开始i向j方向进行遍历当遍历到的数据比key小且比array[j]的值大的时候,交换array[i]和array[j]的值。然后停止i向j的运动,再开始j向i方向进行遍历,如此循环,当i==j的时候,说明array[i]的位置就是key值应该在的位置,key值在的位置左边都是比key小的值,右边都是比key大的值。 这是第一次循环,所以把key作为中点把数据分成两边,然后再对两边同时进行递归。算到最后排序的开始点与结束点相差仅为1时,整个数组的排序就已经排序好了。

  代码如下:

var array = [],maxNum = 100;

        for(var i=0;i<maxNum;i++){
array.push(parseInt(Math.random()*maxNum));
} console.log("排序前:"+array);
quickSort(array , 0 , array.length-1);
console.log("排序后:"+array); function quickSort(array , start , end){
//key是分割线
var i=start;j = end,key = array[start];
while(i<j){
while(i<j){
if(array[j]<=key&&array[j]<array[i]){ //j->i方向的遍历,如果比key小且比array[i]小,交换数据
var md = array[i];
array[i] = array[j];
array[j] = md;
break;
}
j--;
}
while(i<j){
if(array[i]>=key&&array[i]>array[j]){ //i->j方向的遍历,如果比key大且比array[j]大,交换数据
var md = array[i];
array[i] = array[j];
array[j] = md;
break;
}
i++;
}
}
if(i-start>1){ //对key左边的数据进行递归排序
quickSort(array , start , i-1)
}
if(end-i>1){ //对key右边的数据进行递归排序
quickSort(array , i+1 , end)
}
}

  

  【选择排序】

  原理:将序列划分为无序和有序区,寻找无序区中的最小值和无序区的首元素交换,有序区扩大一个,循环最终完成全部排序。

  代码:

        var array = [],maxNum = 100;

        for(var i=0;i<maxNum;i++){
array.push(parseInt(Math.random()*maxNum));
} console.log("排序前:"+array);
selectSort(array);
console.log("排序后:"+array); function selectSort(array){
var i = 0; //无序区最小指针 while(i<array.length){
var index = 0 , min = null; //index为当前遍历到的地址,min存放最小值
for(var j=i;j<array.length;j++){
if(array[j]<min||min===null){
min = array[j];
index = j;
}
} if(array[i]!==min){ //提高排序稳定性,如果两个元素值相同则不交换
var md = array[i];
array[i] = array[index];
array[index] = md;
}
i++;
}
}

   再贴上一个各个算法之间的计算速度测试DEMO,快速排序果然牛逼,浏览器内置排序函数sort都没快速排序快,当数据量达到千万级的时候,两者的差距就是几十秒了。

    看DEMO请戳我

  源码地址

用javascript实现简单排序算法的更多相关文章

  1. JavaScript中简单排序总结

    JavaScript中简单排序总结 冒泡排序 经典排序算法, 双重for循环 在第二个for循环的时候, j < arr.len -1 -i , 这一步的优化很重要 function bullS ...

  2. 简单排序算法 C++类实现

    简单排序算法: 冒泡排序 插入排序 选择排序 .h代码: // // SortClass.h // sort and selection // // Created by wasdns on 16/1 ...

  3. 简单排序算法设计(Java)

    总共有八种排序算法,还是慢慢看吧 1.简单排序算法 简单排序算法就是设置标兵,逐个比较数,然后查找插入位置,插入 public static void p(int[] a){ for(int i=0; ...

  4. javascript 中合并排序算法 详解

    javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的...  合并排序代码如下: <script type="text/javascript& ...

  5. JavaScript实现各种排序算法

    前言:本文主要是用JavaScript实现数据结构中的各种排序算法,例如:插入排序.希尔排序.合并排序等. 冒泡排序 function bubbleSort(arr) { console.time(& ...

  6. js的几种简单排序算法及其效率实测

    function swap(arr,index1,index2){ var t = arr[index1]; arr[index1] = arr[index2]; arr[index2] = t; } ...

  7. python实现简单排序算法

    算法 递归两个特点: 调用自身 有穷调用 计算规模越来越小,直至最后结束 用装饰器修饰一个递归函数时会出现问题,这个问题产生的原因是递归的函数也不停的使用装饰器.解决方法是,只让装饰器调用一次即可,那 ...

  8. 三种简单排序算法(java实现)

    一.冒泡排序 算法思想:遍历待排序的数组,每次遍历比较相邻的两个元素,如果他们的排列顺序错误就交换他们的位置,经过一趟排序后,最大的元素会浮置数组的末端.重复操                   作 ...

  9. 几个简单排序算法的Python实现

    一,冒泡排序 冒泡排序我就不多讲了,大体上就是比较相邻的两个数,每次把较大的数沉底.流程图大致上如下: 图是截得别人的,只是说明一下,代码没有参看别人的,写的不好,有更好的写法可以一起探讨.下面是代码 ...

随机推荐

  1. 设计模式C#实现(二)——适配器模式

    适配器模式:将一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间. 如果它走起路来像只鸭子,叫起来像只鸭子,那么它必定可能是一只鸭子包装了鸭子适配器的火鸡…… 最近有一个 ...

  2. javascript 特效实现(2)——回到顶部效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Linux之存储及文件系统管理

    一.存储管理 1.各种存储设备在Linux系统中对应的文件名 2.硬盘结构及分区 1).硬盘结构 2) .为什么要进行硬盘分区: a) 更容易管理和控制系统,因为相关的文件和目录都放在一个分区中. b ...

  4. linux64位android项目R文件无法生成以及Cannot run program adb

    1.本机kali2.0  64位,kali基于Debian. 2.android adb是32位,64位linux要安装32位依赖库,注意ia32-lib被lib32z1替代. 3.执行命令 sudo ...

  5. 解决客户端通过zookeeper连接到hbase时连接过多的问题

    原因:客户端程序通过zookeeper访问hbase的连接数超过设置的默认链接数(默认数是30),连接数不够用会导致后续的连接连接不上去. 解决办法:设置hbase-site.xml配置文件,添加如下 ...

  6. UVALive 6092 Catching Shade in Flatland --枚举+几何计算

    题意:x=[-200,200],y=[-200,200]的平面,一天中太阳从不同角度射到长椅(原点(0,0))上,有一些树(用圆表示),问哪个时刻(分钟为单位)太阳光线与这些圆所交的弦长总和最长.太阳 ...

  7. 2016"百度之星"-资格赛

    //本题要求:(Ar*A2...An)%p,亦即[(A1*A2*...An)/(A1*A2*...Ar-1)]%p,由于A1*A2...An乘积过大,无法求得相除所得的结果 //我们需要用到乘法逆元( ...

  8. 关于comparable与comparator的用法(即自定义集合框架用法 )

    package javastudy; import java.util.Comparator; import java.util.Iterator; import java.util.TreeSet; ...

  9. 数据结构Java实现02----线性表与顺序表

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  10. Java 枚举活用

    /** * 联盟神兽.神兽资源枚举 * * @author TonyCody * @author 13-9-22 * @time 下午5:35 */ public enum LegionDogzTyp ...