相信排序是任何一个程序猿都会用到的东西,今天简单总结记录下常见的排序算法。

一.冒泡排序

说起冒泡排序,可能每个人都不会陌生,实现思路相当简单明了,就是不停的对数组进行两两比较,将较大(较小)的一项放在前面;

如 var arr = [7, 3, 10, 1, 8, 4, 2, 4, 4, 3] 进行升序排列,排序过程如下

第一次 [3, 7, 1, 8, 4, 2, 4, 4, 3, 10]

第二次 [3, 1, 7, 4, 2, 4, 4, 3, 8, 10]

以此类推 。。。。

结果 [1, 2, 3, 3, 4, 4, 4, 7, 8, 10];

//冒泡排序
function bubbleSort(arr){
var len = arr.length,t
for(j=0;j<=len-1;j++){
for(i=0;i<=len-j-1;i++){
if(arr[i]>arr[i+1]){
t = arr[i+1];
arr[i+1] = arr[i];
arr[i] = t;
}
}
}
return arr;
}

二.快速排序

快速排序也是我们常用到的一种排序方式,核心步骤如下

1.选择中间数。

2.构建两个临时数组,比中间数小的放到左边,大的放到右边

3.对临时数组重复1-2;

例如,我们原始数组为[2,4,1,5,6,3,12,9,7],第一步我们选择第5项 6 为中间数,创建临时数组left,right,则left 结果为[2,4,1,5,3],right 结果为 [12,9,7]。然后再分别对left和right进行相同的操作,直至left及right数组长度为1.

具体代码如下:

//快速排序
function quickSort(arr){
if(arr.length <= 1){ //数组长度为1时,则停止递归
return arr
}
var l = Math.floor(arr.length/2); //选择中间数
var left = [],right=[];
var splitEle = arr.splice(l,1)[0] //将中间数从原数组删除并保存
for(i=0;i<arr.length;i++){
if(arr[i] < splitEle){
left.push(arr[i])
}else{
right.push(arr[i])
}
}
return arguments.callee(left).concat(splitEle,arguments.callee(right))
}

三.选择排序

选择排序核心思想如下:

加入我们进行升序排列,我们假设数组第一项为最小值,然后将第一项与其他项分别比较,如果其他项小于第一项,则交换位置,这样第一次循环结束我们可以保证第一项为最小值。然后第二项做类似操作,然后以此类推,具体如下图所示

代码如下:

//选择排序
function selectQuot(arr){
for(i=0; i<arr.length-1; i++){
for(j=i+1;j<arr.length;j++){
if(arr[i] > arr[j]){
var temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return arr
}

四.插入排序

插入排序很好理解,首先我们取出第一项放入一个虚构的数组,然后取第二项,假如第二项小于第一项,则将第二项放于第一项的前面,否则放在后面;然后取第三项,分别与前两项进行比较(是不是有点儿类似打扑克牌~~)

如我们的数组为[2, 4, 1, 5, 3, 8 ,7 ,9 , 6];

假定我们有一个虚拟数组,则第一步数组为[2],然后我们取数组的第二项,发现要比刚才取得数组项大,则我们放在后面即虚拟数组变成[2,4],然后取下一项与虚拟数组中的项分别比较,按上述思路结果为[1,2,4],以此类推……当然在实际编程中我们并不需要单独创建数组。

代码如下:

//插入排序
function insertSort(arr){
for(i=1 ; i<arr.length ; i++ ){
var temp = arr[i],
j = i - 1;
while(j>=0 && temp < arr[j]){
arr[j+1] = arr[j]; //相当于将虚拟数组当前项后移一位,同时虚拟数组长度+1
j--;
}
arr[j+1] = temp; //新加项最终插入的位置
}
return arr;
}

五.希尔排序

希尔排序是插入排序的升级版,又称为缩小增量排序。

对于插入排序算法来说,如果原来的数据就是有序的,那么数据就不需要移动,基于此,希尔排序首先将数组按照一定间隔分为若干个小数组分别进行插入排序,然后逐渐减小间隔,直至为1,这样最后一次处理即间隔为1的排序,但由于之前的操作后数组基本变为有序数组,这样就能提高些效率。示意如下:

我们原始数组为[3, 4, 6, 5, 1, 9, 6, 10, 8, 8]

第一步我们假设增量为3,按照希尔排序思路我们将数组如下分割

我们每一次将同样的分组赋予同一颜色,然后对每一分组进行插入排序,空白颜色为结果。

实现代码如下:

//希尔排序
function shellSort(array) {
var len = array.length;
var gap = len;
do {
gap = Math.floor(gap/3)+1; // 减小增量
// 把距离为gap的元素编为一个组,扫描所有组
for (var i = gap; i < len; i++) {
var temp = array[i],
j = i - gap;
while(j>=0 && temp < array[j]){
array[j + gap] = array[j];
j -= gap;
}
array[j+gap] = temp;
}
}while(gap > 1)
return array
}

六.归并排序

归并排序的核心思想是,首先将数组分成若干个子数组变成有序数组,再合并有序数组。

具体流程盗用网络上一张图,一看便知

代码如下:

var mergeSort = {
splitArr : function(arr){
if(arr.length == 1) return arr;
var mid = Math.floor(arr.length/2),
left = arr.slice(0,mid),
right = arr.slice(mid);
return this.merge(this.splitArr(left),this.splitArr(right))
},
merge : function(left , right){
var result = [];
while(left.length > 0 && right.length > 0){
if(left[0] < right[0]){
result.push(left.shift())
}else{
result.push(right.shift())
}
}
return result.concat(left).concat(right)
}
}

如果您觉得文章对您有帮助,请帮忙点击右下角的推荐,文中不足之处也欢迎指出以便及时改正。

js排序算法总结—冒泡,快速,选择,插入,希尔,归并的更多相关文章

  1. javascript数据结构与算法--基本排序算法(冒泡、选择、排序)及效率比较

    javascript数据结构与算法--基本排序算法(冒泡.选择.排序)及效率比较 一.数组测试平台. javascript数据结构与算法--基本排序(封装基本数组的操作),封装常规数组操作的函数,比如 ...

  2. php 冒泡 快速 选择 插入算法 四种基本算法

    php四种基础算法:冒泡,选择,插入和快速排序法 来源:PHP100中文网 | 时间:2013-10-29 15:24:57 | 阅读数:120854 [导读] 许多人都说 算法是程序的核心,一个程序 ...

  3. js排序算法总结——冒泡,快速,选择,插入,希尔,归并

    相信排序是任何一个程序猿都会用到的东西,今天简单总结记录下常见的排序算法. 一.冒泡排序 说起冒泡排序,可能每个人都不会陌生,实现思路相当简单明了,就是不停的对数组进行两两比较,将较大(较小)的一项放 ...

  4. Java排序算法之冒泡、选择、插入、快速

    JavaSort Java经典排序算法代码 2018-1-26更新:冒泡排序,选择排序,插入排序,快速排序 1. 冒泡排序 特点:效率低,实现简单 思想(从小到大排): 第1个数和第2个数比较,如果第 ...

  5. python排序算法之冒泡,选择,插入

    1.参考 一本关于排序算法的 GitBook 在线书籍 <十大经典排序算法>,使用 JavaScript & Python & Go 实现 2.冒泡排序:两两比较,互换位置 ...

  6. 排序算法(冒泡,选择,快速)Java 实现

    冒泡 排序: public static void Bubblesort(int [] a) { for(int x=0;x<=a.length-1;x++) { for(int y=0;y&l ...

  7. 排序算法(冒泡、选择)-python代码展示

    冒泡排序: def bubble_sort(list): for i in range(len(list) - 1): # 这个循环负责设置冒泡排序进行的次数 for j in range(len(l ...

  8. Shell数组以及排序算法(冒泡、直接选择、反转)

    Shell数组以及排序算法(冒泡.直接选择.反转) 目录 Shell数组以及排序算法(冒泡.直接选择.反转) 一.数组概述 1. 数组的定义 2. 下标的定义 3. 数组的特点 4. 数组定义的方法 ...

  9. 总结下js排序算法和乱序算法

    其实本人最怕的就是算法,大学算法课就感觉老师在讲天书,而且对于前端来说,算法在实际的应用中实在是很有限.毕竟算法要依靠大量的数据为基础才能发挥出算法的效率,就浏览器那性能,......是吧,退一万步说 ...

随机推荐

  1. Javascript数组学习

    记录下学习数组的过程 1.创建数组 var ary1 = new Array();//空数组 var ary2= [] ;//字面量 2.数组检测 //方法一 if(array instanceof ...

  2. MongoDB安装

    安装 1>设置MongoDB目录 cd /home/apps      附:centOS下创建目录命令  mkdir /home/apps 2>下载mongodb curl -O http ...

  3. 使用python抓取百度搜索、百度新闻搜索的关键词个数

    由于实验的要求,需要统计一系列的字符串通过百度搜索得到的关键词个数,于是使用python写了一个相关的脚本. 在写这个脚本的过程中遇到了很多的问题,下面会一一道来. ps:我并没有系统地学习过pyth ...

  4. css_随笔

    1 css 基础语法: 2 派生选择器 li strong { font-style: italic; font-weight: normal; } <p><strong>我是 ...

  5. Android中Button的五种监听事件

    简单聊一下Android中Button的五种监听事件: 1.在布局文件中为button添加onClick属性,Activity实现其方法2.匿名内部类作为事件监听器类3.内部类作为监听器4.Activ ...

  6. 什么时候用Model,什么时候用Entity?

    在建立一个实体类的时候,究竟是用Model还是用Entity?比如MVC中,Model存了数据实体,但是他被称为Model,而在EF中,Entity也是存放数据实体,却被称作Entity,这两者有何区 ...

  7. 转:IOC框架

    CSND上看了王泽滨的博客关于IOC的,觉得说的很透彻,地址为:http://blog.csdn.net/wanghao72214/article/details/3969594 1 IoC理论的背景 ...

  8. sz rz SecureCRT

    yum install lszrz apt-get install lszrz wget http://down1.chinaunix.net/distfiles/lrzsz-0.12.20.tar. ...

  9. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  10. Java POI 解析word文档

    实现步骤: 1.poi实现word转html 2.模型化解析html 3.html转Map数组 Map数组(数组的操作处理不做说明) 1.导jar包. 2.代码实现 package com.web.o ...