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

1、冒泡排序

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

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

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

2、选择排序

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

3、桶排序

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

    


4、快速排序

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

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

  适合用递归

  1. var arr = [2,5,1,7,3];
  2. function quickSort(arr){
  3. // 终止条件 数组中只有一项or数组为空时终止递归
  4. if(arr.length === 1 || arr.length === 0){
  5. return arr;
  6. }
  7. // 找到中间值 以及它的索引
  8. var mid_index = parseInt(arr.length / 2);
  9. var mid_num = arr[mid_index];
  10. // 分左右
  11. var left = [];
  12. var right = [];
  13. for(var i = 0; i < arr.length ; i++){
  14. // 中间点不需要和自己比较
  15. if(i === mid_index){
  16. continue;
  17. }
  18. // 分配左右
  19. if(arr[i] > mid_num){
  20. right.push(arr[i]);//大的去右边
  21. }else{
  22. left.push(arr[i]);
  23. }
  24. }
  25. // 最终结果是 拼接排好序的left+中间的数据+right
  26. return quickSort(left).concat([mid_num],quickSort(right));
  27. }
  28. var res = quickSort(arr);
  29. 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. com.spotify:docker-maven-plugin 报localhost:2375 Connection refused 错误

    当用maven build项目时出现了如下错误: Failed to execute goal com.spotify:docker-maven-plugin:0.4.13:build (defaul ...

  2. 关于php自学

    自己本人现在正在自学php有一段时间了,不知道现在的学习状态咋样,在我看来应该属于不算很糟糕,但有点糟糕的状态. 如果算学习自学php的话,现在断断续续应该是有5个月了,按理说是差不多可以做出独立项目 ...

  3. win10 安装VMware Workstation Pro提示无法在windows上运行

    win10 安装vm无法在windows上运行 之前还可以用 网上搜了一下  要安装最新15.5.0就不会报错了 没毛病!! 不想注册下载 百度网盘(2019年9月19日版本) https://pan ...

  4. 你还记得2017年火爆的VR街机店,这一年他们过得还好吗?

    对于当下太过急于成功.一夜暴富的人们来说,似乎总是会急不可耐地去抓住每一个有可能成为大势的风口.在这份普遍存在的浮躁心理下,蕴含着极大的不确定性--既让大众认识到太多的创新产品和服务,也让很多参与者痛 ...

  5. Python包管理工具setuptools相关

    setup函数常用参数: --name                         包名称 --version                      包版本 --author          ...

  6. Android实习生 —— 屏幕适配及布局优化

    为什么要进行屏幕适配.对哪些设备进行适配?在近几年的发展当中,安卓设备数量逐渐增长,由于安卓设备的开放性,导致安卓设备的屏幕尺寸大小碎片化极为严重.从[友盟+]2016年手机生态发展报告H1中看截止1 ...

  7. 实用的Python(3)超简单!基于Python搭建个人“云盘”

    1 简介 当我们想要从本地向云服务器上传文件时,比较常用的有pscp等工具,但避免不了每次上传都要写若干重复的代码,而笔者最近发现的一个基于Python的工具updog,可以帮助我们在服务器上搭建类似 ...

  8. C++ 迷宫寻路问题

    迷宫寻路应该是栈结构的一个非常经典的应用了, 最近看数据结构算法应用时看到了这个问题, 想起来在校求学时参加算法竞赛有遇到过相关问题, 感觉十分亲切, 在此求解并分享过程, 如有疏漏, 欢迎指正 问题 ...

  9. css手写一个表头固定

    Bootstrap,layui等前端框架里面都对表头固定,表格滚动有实现,偏偏刚入职的公司选择了手动渲染表格,后期又觉得表格数据拉太长想要做表头固定.为了避免对代码改动太大,所以决定手写表头固定 主要 ...

  10. 使用openxml提取word中的文本和图片并转为Html

    使用openxml提取word中的文本和图片 使用 openXml 提取 word 中的 Text 和 Drawing 使用 openXml 将 word 中的文本和图片转为Html 使用 openX ...