* 以下均是以实现数组的从小到大排序为例

1、冒泡排序

  1. 先遍历数组,让相邻的两个元素进行两两比较 。如果要求小到大排:最大的应该在最后面,如果前面的比后面的大,就要换位置;
  2. 数组遍历一遍以后,也就是第一次全部比对结束,最后一个数字就是最大的那个元素;
  3. 然后进行第二遍的遍历,还是按照之前的规则,第二大的数字会在倒数第二的位置;
  4. 以此类推,直到最后按照从小到大的顺序把数组排好。

    冒泡排序的 比对次数 = 数组长度 - 1

         var arr = [3,5,2,7,9,11,6];
// 数组一共7个数字,遍历执行总轮数是 6 轮 7 - 1
for(var k = 0 ; k < arr.length - 1; k ++){
// 1.两两比对
// arr.length - 1 - k 已经排序好的数字也没必要再比对了
for(var i = 0 ; i < arr.length - 1 - k; i++ ){
// 2.如果前面的大于后面的
if( arr[i] > arr[i + 1] ){
// 3.换位
var temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
}
console.log(arr);

2、选择排序

  1. 首先假定0是数组中最小的数字的索引。也就是说第一次比对时,假设数组中的第一个元素是最小;
  2. 遍历数组,索引为0的元素和后面的所有元素进行比对,找到第一个比它小的元素a,将a的索引替换为0,继续向后比较,找到比a还小的b,将b的索引替换为0…
  3. 直到全部比对结束,标记索引为0的就是数组中最小的元素,将他和数组中的第一个元素换位,此时最小的元素在数组的第一位(从小到大排序);
  4. 再来第二次遍历假定1是最小的数字的索引(因为索引0已经无须比对),也就是当前数组中的第二个元素,继续执行步骤2、3;
  5. 以此类推,完成排序。
         var arr = [3,5,2,7,9,11,6];
for(var k = 0; k < arr.length - 1; k ++){
// 假定的最小值的索引
var min = arr[k];
var index = k;
// 求证下标为k的数字是否真的是最小
// 和它后面的数字比对,所以i = k+1
for(var i = k + 1; i < arr.length ; i ++){
// 找到比它小的元素,记为最小
if(arr[i] < min){
min = arr[i];
index = i;
}
}
// 最小值和假定最小值换位
arr[index] = arr[k];
arr[k] = min;
}
console.log(arr);

3、桶排序

  1. 根据数组中数字的最大值 建立对应数量的桶 (遍历时js会自己创建对应数量);
  2. 再根据数组中的每一项数字,把这些数字当做桶的对应索引,给这些索引的桶加水;
  3. 遍历一遍所有的桶,从左到右检索把有水的桶的下标列出来即可。
         var arr = [3,2,5,10,7];
// bocket 承载下标的容器(桶)
var bocket = [];
for(var i = 0; i < arr.length ; i++){
// arr[i]是需要排列的数字
// console.log(arr[i]);
// 让arr中的每一个值arr[i],当做桶里的索引,这些下标是需要加水的
// 赋值为1的意思是加水:需要随意填一个数据,这个数据是什么不重要
bocket[arr[i]] = 1;
}
console.log(bocket);
// 取出索引 先清空原数组,再将排好序的元素push进去
arr.length = 0;
// 去遍历这个桶,列出加水的
for(var attr in bocket){
// for in之中的取出的attr是字符串,所以要转换
arr.push(Number(attr));
}
console.log(arr);

    


4、快速排序

  找中点,分左右。(其实不一定是中点,找一个分界点将数组分为左右两部分就可以)

  1. 找到数组的中点,分出它的左右区;
  2. 左右元素和中间的比对,比中间小去数组的左边,比中间大去右边
  3. 比对完一轮之后,左边和右边的元素也执行1、2操作。对于左侧的数据,又可以找中点,将该部分数据分成左右两部分,小的去左,大的去右。右侧的数组数据同理;
  4. 左右全部排序好后,整个数组的排序也就完成了。

  适合用递归

         var arr = [2,5,1,7,3];
function quickSort(arr){
// 终止条件 数组中只有一项or数组为空时终止递归
if(arr.length === 1 || arr.length === 0){
return arr;
}
// 找到中间值 以及它的索引
var mid_index = parseInt(arr.length / 2);
var mid_num = arr[mid_index];
// 分左右
var left = [];
var right = [];
for(var i = 0; i < arr.length ; i++){
// 中间点不需要和自己比较
if(i === mid_index){
continue;
}
// 分配左右
if(arr[i] > mid_num){
right.push(arr[i]);//大的去右边
}else{
left.push(arr[i]);
}
}
// 最终结果是 拼接排好序的left+中间的数据+right
return quickSort(left).concat([mid_num],quickSort(right));
}
var res = quickSort(arr);
console.log(res);

JavaScript数组排序(冒泡排序、选择排序、桶排序、快速排序)的更多相关文章

  1. JS面试Q&A(续):Javascript数组排序, 默认是字符串Unicode排序, 不适合数字

    Q:下面代码段的执行后data里面的数据是什么?为什么? var data= [40,1,5,200] data.sort(); A: data的内容是[1, 200, 40, 5] 因为,Javas ...

  2. 【PHP数据结构】其它排序:简单选择、桶排序

    这是我们算法正式文章系列的最后一篇文章了,关于排序的知识我们学习了很多,包括常见的冒泡和快排,也学习过了不太常见的简单插入和希尔排序.既然今天这是最后一篇文章,也是排序相关的最后一篇,那我们就来轻松一 ...

  3. 记数排序 & 桶排序 & 基数排序

    为什么要写这样滴一篇博客捏...因为一个新初一问了一道水题,结果就莫名其妙引起了战斗. 然后突然发现之前理解的桶排序并不是真正的桶排序,所以写一篇来区别下这三个十分相似的排序辣. 老年菜兔的觉醒!!! ...

  4. 数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现

    这五种排序算法难度依次增加. 冒泡排序: 第一次将数组相邻两个元素依次比较,然后将大的元素往后移,像冒泡一样,最终最大的元素被移到数组的最末尾. 第二次将数组的前n-1个元素取出,然后相邻两个元素依次 ...

  5. python 排序 桶排序

    算法思想: 桶排序将数组分到有限数量的桶里.然后每个桶里再分别排序(使用任何算法) 当要倍排序的数组内的数值时均匀分配的时候,桶排序使用线性时间O(n) 步骤: 根据最大值.最小值.桶内数据范围设定一 ...

  6. Python线性时间排序——桶排序、基数排序与计数排序

    1. 桶排序 1.1 范围为1-M的桶排序 如果有一个数组A,包含N个整数,值从1到M,我们可以得到一种非常快速的排序,桶排序(bucket sort).留置一个数组S,里面含有M个桶,初始化为0.然 ...

  7. 桶排序(BucketSort)

    1 桶排序核心思想是 根据数据规模n划分 m个相同大小的区间 (每个区间为一个桶,桶可理解为容器) 2 每个桶存储区间内的元素(区间为半开区间 例如[0,10) 或者 [200,300) ) 3 将n ...

  8. 计数排序和桶排序(Java实现)

    目录 比较和非比较的区别 计数排序 计数排序适用数据范围 过程分析 桶排序 网络流传桶排序算法勘误 桶排序适用数据范围 过程分析 比较和非比较的区别 常见的快速排序.归并排序.堆排序.冒泡排序等属于比 ...

  9. 计数排序与桶排序python实现

    计数排序与桶排序python实现 计数排序 计数排序原理: 找到给定序列的最小值与最大值 创建一个长度为最大值-最小值+1的数组,初始化都为0 然后遍历原序列,并为数组中索引为当前值-最小值的值+1 ...

  10. 桶排序和计数排序的理解实现和比较(Java)

    比较和非比较的区别 常见的快速排序.归并排序.堆排序.冒泡排序等属于比较排序.在排序的最终结果里,元素之间的次序依赖于它们之间的比较.每个数都必须和其他数进行比较,才能确定自己的位置.比较排序的优势是 ...

随机推荐

  1. http,tcp,udp的报文格式

    http请求报文与响应报文:https://blog.csdn.net/qq_26565861/article/details/80969960 tcp与udp报文:https://www.cnblo ...

  2. [BZOJ 3144][HNOI 2013] 切糕

    题目大意 切糕是 (p times q times r) 的长方体,每个点有一个违和感 (v_{x, y, z}).先要水平切开切糕(即对于每个纵轴,切面与其有且只有一个交点),要求水平上相邻两点的切 ...

  3. 【内推】平安产险大数据测试开发工程师,15-30k!

    平安产险技术岗内部推荐-大数据测试开发工程师等-欢迎中年人和2020应届生 上班地点:深圳福田平安金融中心 另有大量 上海 北京 成都 广州 岗位 交流qq群 828186629 微信pythonte ...

  4. Hive Functions

    函数的分类 内置函数 操作符 复杂对象 UDF函数 数学函数 类型转换函数 日期函数 条件函数 UDTF函数 常用UDTF函数 explode posexplode inline stack json ...

  5. C++走向远洋——38(用对象数组操作长方柱类)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:changfangzhu.cpp * 作者:常轩 * 微信公众号 ...

  6. C++走向远洋——22(项目一,三角形,类)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:sanjiaoxing.cpp * 作者:常轩 * 微信公众号: ...

  7. 1、【Spark】Spark安装

    本文基于的环境 Red Hat Linux Enterprise 7 x86_64 jdk 1.7.0_79 Python 2.7Spart spark-1.5.2-bin-hadoop2.6 官方要 ...

  8. sed 分组替换

    将文件以help开头的句子前加# [root@localhost]# cat a.txthelp b helphelp1helphelp2help c help[root@localhost]# se ...

  9. 简单的员工管理系统(Mysql+jdbc+Servlet+JSP)

    员工管理系统 因为学业要求,需要完成一个过关检测,但是因为检测之前没有做好准备,且想到之前用mysql+jdbc+Struts2+bootstrap做成了一个ATM系统(主要有对数据的增删改查操作), ...

  10. 如何正确使用redis分布式锁

    前言   笔者在公司担任技术面试官,在笔者面试过程中,如果面试候选人提到了reids分布式锁,笔者都会问一下redis分布式锁的知识点,但是令笔者遗憾的是,该知识点十个人中有九个人都答得不清楚,或者回 ...