JavaScript希尔排序、快速排序、归并排序算法


Posted in Javascript onMay 08, 2016

以var a = [4,2,6,3,1,9,5,7,8,0];为例子。

1.希尔排序。 希尔排序是在插入排序上面做的升级。是先跟距离较远的进行比较的一些方法。

function shellsort(arr){ 
  var i,k,j,len=arr.length,gap = Math.ceil(len/2),temp; 
  while(gap>0){ 
    for (var k = 0; k < gap; k++) { 
      var tagArr = []; 
      tagArr.push(arr[k]) 
      for (i = k+gap; i < len; i=i+gap) {        
        temp = arr[i]; 
        tagArr.push(temp); 
        for (j=i-gap; j >-1; j=j-gap) { 
          if(arr[j]>temp){ 
            arr[j+gap] = arr[j]; 
          }else{ 
            break; 
          } 
        } 
        arr[j+gap] = temp; 
      } 
      console.log(tagArr,"gap:"+gap);//输出当前进行插入排序的数组。 
      console.log(arr);//输出此轮排序后的数组。 
    } 
    gap = parseInt(gap/2); 
  } 
  return arr; 
}

过程输出:

[4, 9] "gap:5" 
[4, 2, 6, 3, 1, 9, 5, 7, 8, 0] 
[2, 5] "gap:5" 
[4, 2, 6, 3, 1, 9, 5, 7, 8, 0] 
[6, 7] "gap:5" 
[4, 2, 6, 3, 1, 9, 5, 7, 8, 0] 
[3, 8] "gap:5" 
[4, 2, 6, 3, 1, 9, 5, 7, 8, 0] 
[1, 0] "gap:5" 
[4, 2, 6, 3, 0, 9, 5, 7, 8, 1] 
[4, 6, 0, 5, 8] "gap:2" 
[0, 2, 4, 3, 5, 9, 6, 7, 8, 1] 
[2, 3, 9, 7, 1] "gap:2" 
[0, 1, 4, 2, 5, 3, 6, 7, 8, 9] 
[0, 1, 4, 2, 5, 3, 6, 7, 8, 9] "gap:1" 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

由输出可以看到。第一轮间隔为5。依次对这些间隔的数组插入排序。
间隔为5:

[4, 9] "gap:5" 
[4, 2, 6, 3, 1, 9, 5, 7, 8, 0] 
[2, 5] "gap:5" 
[4, 2, 6, 3, 1, 9, 5, 7, 8, 0] 
[6, 7] "gap:5" 
[4, 2, 6, 3, 1, 9, 5, 7, 8, 0] 
[3, 8] "gap:5" 
[4, 2, 6, 3, 1, 9, 5, 7, 8, 0] 
[1, 0] "gap:5" 
[4, 2, 6, 3, 0, 9, 5, 7, 8, 1] 
[4, 6, 0, 5, 8] "gap:2" 
[0, 2, 4, 3, 5, 9, 6, 7, 8, 1] 
[2, 3, 9, 7, 1] "gap:2" 
[0, 1, 4, 2, 5, 3, 6, 7, 8, 9] 
[0, 1, 4, 2, 5, 3, 6, 7, 8, 9] "gap:1" 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

间隔为2:

[4, 2, 6, 3, 0, 9, 5, 7, 8, 1] 
 4   6   0   5   8 
  2   3   9   7   1

排序后:
[0, 1, 4, 2, 5, 3, 6, 7, 8, 9] 

间隔为1:
排序后:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]。

2.快速排序。把一个数组以数组中的某个值为标记。比这个值小的放到数组的左边,比这个值得大的放到数组的右边。然后再递归 对左边和右边的数组进行同样的操作。直到排序完成。通常以数组的第一个值为标记。
代码:

function quickSort(arr){ 
  var len = arr.length,leftArr=[],rightArr=[],tag; 
  if(len<2){ 
    return arr; 
  } 
  tag = arr[0]; 
  for(i=1;i<len;i++){ 
    if(arr[i]<=tag){ 
      leftArr.push(arr[i]) 
    }else{ 
      rightArr.push(arr[i]); 
    } 
  } 
  return quickSort(leftArr).concat(tag,quickSort(rightArr)); 
}

3.归并排序。把一系列排好序的子序列合并成一个大的完整有序序列。从最小的单位开始合并。然后再逐步合并合并好的有序数组。最终实现归并排序。
合并两个有序数组的方法:

function subSort(arr1,arr2){ 
 
  var len1 = arr1.length,len2 = arr2.length,i=0,j=0,arr3=[],bArr1 = arr1.slice(),bArr2 = arr2.slice(); 
 
  while(bArr1.length!=0 || bArr2.length!=0){ 
    if(bArr1.length == 0){ 
      arr3 = arr3.concat(bArr2); 
      bArr2.length = 0; 
    }else if(bArr2.length == 0){ 
      arr3 = arr3.concat(bArr1); 
      bArr1.length = 0; 
    }else{ 
      if(bArr1[0]<=bArr2[0]){ 
        arr3.push(bArr1[0]); 
        bArr1.shift(); 
      }else{ 
        arr3.push(bArr2[0]); 
        bArr2.shift(); 
      } 
    } 
  } 
  return arr3; 
}

归并排序:

function mergeSort(arr){ 
  var len= arr.length,arrleft=[],arrright =[],gap=1,maxgap=len-1,gapArr=[],glen,n; 
  while(gap<maxgap){ 
    gap = Math.pow(2,n); 
    if(gap<=maxgap){ 
      gapArr.push(gap); 
    } 
    n++; 
  } 
  glen = gapArr.length; 
  for (var i = 0; i < glen; i++) { 
    gap = gapArr[i]; 
    for (var j = 0; j < len; j=j+gap*2) { 
      arrleft = arr.slice(j, j+gap); 
      arrright = arr.slice(j+gap,j+gap*2); 
      console.log("left:"+arrleft,"right:"+arrright); 
      arr = arr.slice(0,j).concat(subSort(arrleft,arrright),arr.slice(j+gap*2)); 
    } 
  } 
  return arr; 
}

排序[4,2,6,3,1,9,5,7,8,0]输出:

left:4 right:2 
left:6 right:3 
left:1 right:9 
left:5 right:7 
left:8 right:0 
left:2,4 right:3,6 
left:1,9 right:5,7 
left:0,8 right: 
left:2,3,4,6 right:1,5,7,9 
left:0,8 right: 
left:1,2,3,4,5,6,7,9 right:0,8

看出来从最小的单位入手。
第一轮先依次合并相邻元素:4,2;  6,3; 1,9; 5,7; 8,0
合并完成之后变成: [2,4,3,6,1,9,5,7,0,8]
第二轮以2个元素为一个单位进行合并:[2,4],[3,6];    [1,9],[5,7];    [0,8],[];
合并完成之后变成:[2,3,4,6,1,5,7,9,0,8]
第三轮以4个元素为一个单位进行合并:[2,3,4,6],[1,5,7,9];  [0,8],[]
合并完成之后变成: [1,2,3,4,5,6,7,9,0,8];
第四轮以8个元素为一个单位进行合并: [1,2,3,4,5,6,7,9],[0,8];
合并完成。 [0,1,2,3,4,5,6,7,8,9];

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
javascript转换字符串为dom对象(字符串动态创建dom)
May 10 Javascript
用jquery存取照片的具体实现方法
Jun 30 Javascript
JavaScript数字和字符串转换示例
Mar 26 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
Oct 17 Javascript
jQuery表单域属性过滤器用法分析
Feb 10 Javascript
js遍历map javaScript遍历map的简单实现
Aug 26 Javascript
原生js实现打字动画游戏
Feb 04 Javascript
基于cookie实现zTree树刷新后展开状态不变
Feb 28 Javascript
Angular X中使用ngrx的方法详解(附源码)
Jul 10 Javascript
vue利用axios来完成数据的交互
Mar 23 Javascript
Vue中的混入的使用(vue mixins)
Jun 01 Javascript
借助云开发实现小程序短信验证码的发送
Jan 06 Javascript
基于jquery实现最简单的选项卡切换效果
May 08 #Javascript
基于javascript实现图片滑动效果
May 07 #Javascript
基于jquery实现图片放大功能
May 07 #Javascript
基于bootstrap插件实现autocomplete自动完成表单
May 07 #Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
May 07 #Javascript
js实现上传图片及时预览
May 07 #Javascript
Backbone.js框架中Model与Collection的使用实例
May 07 #Javascript
You might like
融入意大利的咖啡文化
2021/03/03 咖啡文化
java模拟PHP的pack和unpack类
2016/04/13 PHP
Nginx实现反向代理
2017/09/20 Servers
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
2020/02/11 PHP
激活 ActiveX 控件
2006/10/09 Javascript
使用jQuery+HttpHandler+xml模拟一个三级联动的例子
2011/08/09 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
2013/11/25 Javascript
jquery提交form表单时禁止重复提交的方法
2014/02/13 Javascript
JavaScript的21条基本知识点
2014/03/04 Javascript
ReactNative-JS 调用原生方法实例代码
2016/10/08 Javascript
jQuery内存泄露解决办法
2016/12/13 Javascript
JS绘制微信小程序画布时钟
2016/12/24 Javascript
jQuery tip提示插件(实例分享)
2017/04/28 jQuery
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
vue删除html内容的标签样式实例
2018/09/13 Javascript
node.js调用C++函数的方法示例
2018/09/21 Javascript
angularjs请求数据的方法示例
2019/08/06 Javascript
jQuery实现简易QQ聊天框
2020/02/10 jQuery
学前端,css与javascript重难点浅析
2020/06/11 Javascript
修改Vue打包后的默认文件名操作
2020/08/12 Javascript
Node使用koa2实现一个简单JWT鉴权的方法
2021/01/26 Javascript
Python实现计算两个时间之间相差天数的方法
2017/05/10 Python
python:按行读入,排序然后输出的方法
2019/07/20 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
2019/12/10 Python
Python换行与不换行的输出实例
2020/02/19 Python
用Python绘制漫步图实例讲解
2020/02/26 Python
使用Keras中的ImageDataGenerator进行批次读图方式
2020/06/17 Python
python使用建议与技巧分享(二)
2020/08/17 Python
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
财务会计专业求职信
2014/06/09 职场文书
销售员态度差检讨书
2014/10/26 职场文书
高三语文复习计划
2015/01/19 职场文书
党校个人总结
2015/03/04 职场文书
2016秋季运动会开幕词
2016/03/04 职场文书
教你用python实现一个无界面的小型图书管理系统
2021/05/21 Python
利用Matlab绘制各类特殊图形的实例代码
2021/07/16 Python