首页 > 其他分享 >js 排序

js 排序

时间:2023-03-13 15:34:05浏览次数:59  
标签:arr js gap length let 数组 排序 preIndex

冒泡排序

原理:数组中的数据前后两两进行对比,如果后面一个数据小于前面一个则进行交换。

/**
 * 冒泡排序
 * @param {array} arr 
 */
function bubbleSort ( arr = [] ) {
  const length = arr.length
  for ( let i = 0; i < length; i++ ) {
    for ( let j = 0; j < length - i; j++ ) {
      if ( arr[ j ] > arr[ j + 1 ] ) {
        [ arr[ j ], arr[ j + 1 ] ] = [ arr[ j + 1 ], arr[ j ] ]
      }
    }
  }
}

推荐视频:JS冒泡排序

 

选择排序

原理:将未排序的数据的第一个数据作为对比基准,在除了已排序和基准数据以外的数据里找到最小的数据,将该数据和基准数据进行交换。

/**
 * 选择排序
 * @param {array} arr 
 */
function choseSort ( arr = [] ) {
  const length = arr.length
  for ( let i = 0; i < length; i++ ) {
    let minIndex = i // 假设当前元素为最小值
    for ( j = i + 1; j < length; j++ ) {
      if ( arr[ j ] < arr[ minIndex ] ) {
        minIndex = j
      }
    }
    [ arr[ i ], arr[ minIndex ] ] = [ arr[ minIndex ], arr[ i ] ]
  }
}

 推荐视频:小伙教你,5分钟学会 JS中的选择排序

 

快速排序

原理:取数组的中间值为基准数据,把数组中剩余的小于基准数据的数据放在基准数据的左边的新数组中,大于的放在右边的新数组中,再分别将这两个新数组按照原数组取中间值,划分左右新数组的方法进行递归,最后即可得到排序好的数组。


/**
 * 快速排序
 * @param {array} arr 
 * @returns {array} newArray
 */
function quickFun ( arr ) {
  if ( arr.length <= 1 ) return arr
  let middleIndex = Math.floor( arr.length / 2 ) //获取基准数据的下标
  let middleItem = arr.splice( middleIndex, 1 )[ 0 ] //截取基准数据
  let leftArr = []
  let rightArr = []
  for ( let i = 0; i < arr.length; i++ ) {
    if ( arr[ i ] > middleItem ) {
      rightArr.push( arr[ i ] )
    } else {
      leftArr.push( arr[ i ] )
    }
  }
  //将左边数组,基准数据和右边数组进行拼接成一个完整的数组
  return quickFun( leftArr ).concat( middleItem, quickFun( rightArr ) )
}

 

 

插入排序

原理:以数组的第一个数据为基准,想象成一个只有一个数据的数组,将剩下的数据依次插入基准数据所在的数组中合适的位置。

/**
 * 插入排序
 * @param {array} arr 
 */
function pickFun ( arr ) {
  let preIndex = 0 // 进行大小对比的基准数据的下标
  let current = 0 // 进行大小对比的当前选中的剩余数量值
  for ( let g = 1; g < arr.length; g++ ) {
    preIndex = g - 1 // 进行基准数据赋值
    current = arr[ g ] // 获取当前进行对比的剩余数量值
    while ( preIndex >= 0 && arr[ preIndex ] > current ) {
      arr[ preIndex + 1 ] = arr[ preIndex ]
      preIndex--
    }
    arr[ preIndex + 1 ] = current
  }
  return arr
}

推荐视频:插入排序

 

 

希尔排序

原理:基于插入排序进行的优化,先将整个数组按照数组长度的一半进行分组使用插入排序,完成后,再将整个数组按照数组长度的1/4进行分组使用插入排序,重复以上步骤,直到分组长度为1为止。

/**
 * 希尔排序
 * @param {array} arr 
 * @returns {array} newArr
 */
function hillFun ( arr ) {
  //第一层循环,确定间隔数
  // 这里的 gap 相当于插入排序中的 1 ,所以在第二层循环中 preIndex = i-gap; 相当于插入排序中的 preIndex = g - 1;
  for ( let gap = parseInt( arr.length / 2 ); gap > 0; gap = parseInt( gap / 2 ) ) {
    //第二层循环,使用插入排序
    for ( let i = gap; i < arr.length; i++ ) {
      let preIndex = i - gap
      let current = arr[ i ]
      while ( preIndex >= 0 && current < arr[ preIndex ] ) {
        arr[ preIndex + gap ] = arr[ preIndex ]
        preIndex -= gap
      }
      arr[ preIndex + gap ] = current
    }
  }
  return arr
}

推荐视频:[算法]六分钟彻底弄懂希尔排序,简单易懂

 

 

 

参考js数组排序的六种方法

标签:arr,js,gap,length,let,数组,排序,preIndex
From: https://www.cnblogs.com/wq2022/p/sort.html

相关文章

  • 在Windows 7上安装Node.js 14(及更高)的办法
    下载Windows7可用的最后一个版本也就是12版本。从 https://nodejs.org/en/download/ 下载、安装即可。下载14版本的.zip文件,必须是zip(按照以下方法目前我只弄成功了n......
  • fastjson 报错:com.alibaba.fastjson.JSONObject cannot be cast to xxxx
    有一个StockData对象,正常情况下json字符串转对象应该是:StockDatastockData=JSONObject.parseObject(str,StockData.class);这样转没问题,get获取参数也正常,但是如果对象......
  • Oracle 随机排序
    方法:SELECTT.*FROMTABLETORDERBYDBMS_RANDOM.VALUE(0,100);ORDERBYDBMS_RANDOM.VALUE(0,100),为结果集的每一行计算一个随机数,DBMS_RANDOM.VALUE(0,100)......
  • AngularJS实现跨域请求
    跨域,前端开发中经常遇到的问题,AngularJS实现跨域方式类似于Ajax,使用CORS机制。下面阐述一下AngularJS中使用$http实现跨域请求数据。AngularJSXMLHttpRequest:$http用于读......
  • AngularJS实现cookie跨域
    前后端分离被越来越多的公司重视利用,然后带来的最棘手的问题就是,用户信息应如何保存。一、场景描述以Java为后台,AngluarJS做前端为例进行描述:当用户在界面登录时,需把用户......
  • js复制到剪贴板 兼容电脑手机以及提示代码 亲测有用
    js复制到剪贴板是在网页切图中经常用到的效果之一,而剪贴板因为在不同设备下的语法略有差异,所以通常选择一个靠谱的复制剪贴板插件,通常主流的插件是Clipboard,所以这次采用了......
  • JSch - Java实现的SFTP(文件上传下载)
    JSch-SFTP文件上传下载目录JSch-SFTP文件上传下载1.JSch简介2.ChannelSftp常用ApiJSch支持三种文件传输模式文件上传put()方法文件下载get()方法3.SFTP上传......
  • Vue.js框架:单个div盒子(元素)放至全屏显示
    一、页面元素需要全屏展示的div或其他元素标签的id要设置,方便获取dom节点。再添加一个可以触发点击事件的元素进行操作。<divid="fullDom"><span@click......
  • React之JSX 简介详细介绍
    设想如下变量声明:constelement=<h1>Hello,world!</h1>;这个有趣的标签语法既不是字符串也不是HTML。它被称为JSX,是一个JavaScript的语法扩展。我们建议在Rea......
  • JS_0074:new Promise await 等待后执行,同步加载 加载threejs 加载字体
    1,一,使用TextGeometry创建3D文字1.需加载字体配合使用,使用THREE.FontLoader//加载字体loadFont(){returnnewPromise(function(resolve,reject)......