前言:因为要对后端返回来的数据进行处理,之前之后冒泡,不够用,去看了插入跟快速,写下这篇笔记。

使用背景:

1.冒泡排序

  数据比较少,小于1000

2.插入排序

  数据比较少,大于1000不推荐

3.快速排序

  相对于前两者,适合处理量大的数据

一: 冒泡排序

  主要思想:将每个数跟数组中的其他数两两比较大小,交换位置。

var arr = [1,5,10,15,100,25,50]

// 需要注意,想要完成冒泡排序,需要两轮for循环
for (var i = 0; i < arr.length; i++) {
  // 拿到每个数arr[i],再去遍历 i 后面的数去做比较
  for (var j = i + 1; j < arr.length; j++) {
    // 比较大小
    // 升序
    if (arr[i] > arr[j]) {
      var tmp = arr[i]
      arr[i] = arr[j]
      arr[j] = tmp
    }
  }
} console.log(arr) // [1, 5, 10, 15, 25, 50, 100]

其他应用: 数组存储的是对象,利用arr[i].value 去比较

关键点: 控制循环次数,i是数组的长度,j是从i的位置+1开始,因为前面的数值已经排好了

可以优化的点: 假设数组本身就是排序好的,这时候再去比较大小就很不合理,设置标识

二、插入排序

主要思想:

  1.把数组分成一个有序数列和一个无序数列

  2.默认把数组第一项当成一个有序数列

  3.拿第一项去跟其他无序项比较大小

  4.调换位置

var arr = [10,5,25,30,100,25,231,52,1,6,0]
function sort(arr) {
  for (let i = 1; i < arr.length; i++) {
    if (arr[i] < arr[i-1]) {
      let tmp = arr[i]
      let j = i - 1
      arr[i] = arr[j]

      

      // 这里比较关键 tmp一直存着小的值

      while (j >= 0 && tmp < arr[j]) {
        arr[j+1] = arr[j]
        j--
      }
      // 直到 j = -1跳出while循环,所有j+1 = 0 等于最小的值
      arr[j + 1] = tmp
    }
  }
  return arr
}
console.log('before', arr)
console.log('after', sort(arr))

别光想,有点绕很正常的,有手写一下过程

三、快速排序(重点,面试比较多?)

主要思想:

  1.随机用数组的其中一个值当基准值(中间值、中介、中线),我喜欢用数组第一项

  2.left等于0,right等于数组的长度-1,从左往右

举个例子:

var arr = [5,3,6,2,7,9,10]
// 假设中间值是数组第一项 5
// 那我们想要的数组应该是这样的
arr = [2,3,5,6,7,9,10]
// 以 5 为中介,左边比5小或者等于,右边比5大或者等于

用代码实现

var arr = [5,3,2,4,6,9,7,10]

function quickSort(arr, i, j) {
  var left = i
  var right = j
  
  if (left < right) {
    //如果数组有两项以上
    var base = arr[left]
    // 设置中间值,开始比较
    
    while (left !== right) {
      // 这里是找比中间值小的值并设置
      while (right > left && arr[right] >= base) {
        // 假设此时right = 4
        // right-- = 3 arr[left] = arr[3] = 4,这个时候再出去while判断,条件已经不成立了,我们也拿到了比base小的值了
        right--
        arr[left] = arr[right]
      }
      // 这里是找比中间值大的值并设置
      while (left < right && arr[left] <= base) {
        left++
        arr[right] = arr[left]
      }
    }
    // 设置中间值的位置
    arr[right] = base
    // 递归调用,直到数列别分解成一个数值组成的数列
    arguments.callee(arr, i, left-1)
    arguments.callee(arr, right+1, j)
    return arr
  }
} console.log(quickSort(arr, 0, arr.length-1)

JS数组——冒泡、插入、快速排序的更多相关文章

  1. js数组冒泡

    var arr 1= [1, 2, 3, 4, 5]; 最简单的 每组数字之间用逗号隔开 第一个数的索引值为0.数字为1 以此类推 中括号的内容是存var arr2 = Array(1, 2, 3); ...

  2. js数组冒泡排序,快速排序的原理以及实现

    冒泡排序: 随便从数组中拿一位数和后一位比较,如果是想从小到大排序,那么就把小的那一位放到前面,大的放在后面,简单来说就是交换它们的位置,如此反复的交换位置就可以得到排序的效果. var arr = ...

  3. js数组冒泡排序、快速排序、插入排序

    1.冒泡排序 //第一种 function bubblesort(ary){ for(var i=0;i<ary.length-1;i++){ for(var j=0;j<ary.leng ...

  4. 如何在JS数组特定索引处指定位置插入元素?

    如何在JS数组特定索引处指定位置插入元素? 需求: 将一个元素插入到现有数组的特定索引处.听起来很容易和常见,但需要一点时间来研究它. // 原来的数组var array = ["one&q ...

  5. js 给json添加新的字段,或者添加一组数据,在JS数组指定位置删除、插入、替换元素

    JS定义了一个json数据var test={name:"name",age:"12"};需要给test再添加一个字段,需要什么办法,可以让test的值为{na ...

  6. 数组的操作。1,JS数组去重。2,把数组中存在的某个值,全部找出来。3在JS数组指定位置插入元素。。。

    1,数组去重 let arr = [1,2,3,4,5,6,1,2,3,'a','b','a']; let temp = []; // 作为存储新数组使用 for(let i = 0; i < ...

  7. js向一个数组中插入元素的几个方法-性能比较

    向一个数组中插入元素是平时很常见的一件事情.你可以使用push在数组尾部插入元素,可以用unshift在数组头部插入元素,也可以用splice在数组中间插入元素. 但是这些已知的方法,并不意味着没有更 ...

  8. js数组快速排序/去重

    数组的排序  快速排序 思路: (1)在数据集之中,选择一个元素作为”基准”(pivot). (2)所有小于”基准”的元素,都移到”基准”的左边:所有大于”基准”的元素,都移到”基准”的右边. (3) ...

  9. js数组操作大全

    原文(http://www.cnblogs.com/webhotel/archive/2010/12/21/1912732.html) 用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简 ...

随机推荐

  1. 在Linux上安装zsh

    简单介绍: 相对于绝大多数linux发行版默认的shell--bash,zsh绝对是一个优秀的替代品.zsh是交互型shell,同一时候它也是一个强大的编程语言,很多bash,ksh,tcsh优秀的地 ...

  2. 网页设计中11 款最好CSS框架

    网页设计和发展领域已经成为竞争激烈的虚拟世界.想要在网络的虚拟世界中生存,仅有一堆静止的在线网络应用是远远不够的,网页必须要有很多功能,配以让人无法抗拒的设计.网页编码一定要合适.精确,才能保证不发生 ...

  3. linux常见基础问题

    1,32位与64位的区别,怎么查看系统版本? 32位相比于64位处理速度更慢一些,64位同样也比32位更占内存.用户体验上没有区别:用uname  -a 查看系统版本信息 2,swap分区的作用是什么 ...

  4. TC SRM 597 DEV2

    第一次玩TC的SRM,只完成了一题,有点失落,不过还是要把每个问题都研究清楚才是我的本性,呵呵 第一题思路: 任意一个数,不断除掉2以后的剩下的数若相同则YES否则NO 第二题: 最开始判断字母个数是 ...

  5. 报表应用系列——图表JFreeChart: 第 4 章 折线图

    双击代码全选 1 2 3 4 5 DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.addValue(100 ...

  6. Python基础第二天

    一.内容 二.练习 练习1 题目:已知msg='hello knight 666'编写for循环,利用索引遍历出每一个字符 图示: 代码: msg = 'hello knight 666' msg_l ...

  7. obs nginx-rtmp-module搭建流媒体服务器实现直播 ding

    接下来我就简单跟大家介绍一下利用nginx来搭建流媒体服务器. 我选择的是腾讯云服务器 1.下载nginx-rtmp-module: nginx-rtmp-module的官方github地址:http ...

  8. JavaScript 解析读取XML文档 实例代码(转)

    JavaScript解析读取XML文件,主要就是加载并解析XML文件,然后就可以测试解析的XML文件的内容,打印输出来. 在线演示:http://demo.jb51.net/js/2012/readx ...

  9. 【149】ArcGIS Desktop 10.0 & Engine 10.0 安装及破解

    写在前面:可能会出现按照此方法无法破解的情况,那请确保您有将 ArcGIS 10.0 已经完全卸载干净,直接通过控制面板进行卸载的时候并不能将其卸载干净,需要进行更深层次的卸载,包括删除注册表,各种文 ...

  10. Tomcat的jvm配置

    Tomcat本身不能直接在计算机上运行,需要依赖于操作系统和一个JAVA虚拟机.Tomcat的内存溢出本质就是JVM内存溢出,JAVA程序启动时JVM会分配一个初始内存和最大内存给程序.当程序需要的内 ...