JS常用的6种数组排序

目录

    • 1,冒泡排序
    • 2,快速排序
    • 3,插入排序
    • 4,选择排序
    • 5,希尔排序
    • 6,归并排序
    • 7,六种方法的集合

1,冒泡排序


冒泡排序又称为交换排序。原理是从第一个元素开始,比较相邻元素的大小,若大小顺序有误,则两数对调,再进行下一个元素的比较。如此经过第一次扫描后就可以确保最后一个元素位于正确的顺序。经过第二次扫描可以确保倒数第二个元素位于正确的顺序。由此可知,N个元素经过(N-1)次扫描,就可以完成所有元素的排序。

冒泡排序

// 冒泡排序
function Bubble (arr) {let lengthA = arr.length -1;for(let k = 0;k < lengthA;k++){let done = true;for(let i = 0;i < lengthA - k;i++){let a = arr[i];if(arr[i] > arr[i+1]){arr[i] = arr[i+1]arr[i+1]= a;done = false;};};if(done) break;};return arr;
};

2,快速排序


快速排序又称分割交换排序,是使用 “分而治之” 的方式,先在数据中找到一个虚拟的中间值,并按此中间值将所有的数据分为两部分。其中,小于中间值的数据放在左边,大于中间值的数据放在右边,再以同样的方式分别处理左、右两边的数据,直到排序完为止。

快速排序

// 快速排序
function QuickSort(arr) {if (arr.length <= 1) {return arr;}if (Array.isArray(arr)) {let center = parseInt(arr.length / 2);// 取中间值需要让原数组发生变化let centerNum = arr.splice(center, 1);let left = [];let right = [];for (let i = 0; i < arr.length; i++) {if (arr[i] <= centerNum) {left.push(arr[i]);} else {right.push(arr[i]);};};//使用递归 每次取中间排完再调用两边重新排序return QuickSort(left).concat(centerNum).concat(QuickSort(right));};
}

3,插入排序


插入排序。是将数组中的元素,逐一与已排序好的数据进行比较,前两个元素先排好,再将第三个元素插入适当的位置,所以这三个元素仍然是已排好序的,接着将第四个元素加入,重复此步骤,直到排序完成为止。

插入排序

// 插入排序
function Insert(arr) {if (!Array.isArray(arr)) return false;for (let i = 0; i < arr.length; i++) {var nowNum = arr[i]; // 记录当前的值var prevIndex = i - 1; //前面的索引//对前面进行判断while (prevIndex >= 0 && arr[prevIndex] > nowNum) {//交换位置arr[prevIndex + 1] = arr[prevIndex];prevIndex--;}arr[prevIndex + 1] = nowNum;}return arr;
}

4,选择排序


选择排序,算是枚举法的应用,就是反复从未排序的数列中取出最小的元素,加入到另一个数列中,最后的结果即为已排序的数列。从小到大排序的操作是一开始在所有的数据中挑选一个最小项放在第一个位置,再从第二项开始挑选剩下元素的最小项放在第2个位置,以此反复,直到完成排序为止。

选择排序

// 选择排序
function Select(arr) {if (!Array.isArray(arr)) return false;let temp = null;for (let i = 0; i < arr.length; i++) {//默认记录最小索引let minindex = i;for (let k = i + 1; k < arr.length; k++) {minindex = arr[k] < arr[minindex] ? k : minindex;};//交换位置temp = arr[i];arr[i] = arr[minindex];arr[minindex] = temp;}return arr;
}

5,希尔排序


希尔排序是插入排序的一种,它是针对直接插入排序算法的改进,该方法又称缩小增量排序。希尔排序实质上是一种分组插入方法。它的基本思想是:对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中;然后,对各组内的元素进行直接插入排序。 这一趟排序完成之后,每一个组的元素都是有序的。然后减小gap的值,并重复执行上述的分组和排序。重复这样的操作,当gap=1时,整个数列就是有序的。

希尔排序

// 希尔排序
function ShellSort(arr) {let len = arr.length,temp,gap = 1;// 动态定义间隔序列,也可以手动定义,如 gap = 5;while (gap < len / 5) {gap = gap * 5 + 1;};for (gap; gap > 0; gap = Math.floor(gap / 5)) {for (var i = gap; i < len; i++) {temp = arr[i];for (var j = i - gap; j >= 0 && arr[j] > temp; j -= gap) {arr[j + gap] = arr[j];}arr[j + gap] = temp;}}return arr;
}

6,归并排序


归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
归并排序

// 归并排序function MergeOne(arr) {if (arr.length < 2) {return arr;}//首先将无序数组划分为两个数组let mid = Math.floor(arr.length / 2);let left = arr.slice(0, mid);let right = arr.slice(mid, arr.length);//递归分别对左右两部分数组进行排序合并return this.MergeTwo(this.MergeOne(left), this.MergeOne(right)); },function MergeTwo(left, right) {let result = [];while (left.length > 0 && right.length > 0) {if (left[0] <= right[0]) {//如果左边的数据小于右边的数据,将左边数据取出,放在新数组中result.push(left.shift());} else {result.push(right.shift());}}while (left.length) {result.push(left.shift());}while (right.length) {result.push(right.shift());}return result;}

7,六种方法的集合


<script>let data = [5,6,8,7,3,2,40,100,99,80,10];const Sort = {num:0,// 冒泡排序Bubble (arr) {let lengthA = arr.length -1;for(let k = 0;k < lengthA;k++){let done = true;for(let i = 0;i < lengthA - k;i++){let a = arr[i];if(arr[i] > arr[i+1]){arr[i] = arr[i+1]arr[i+1]= a;done = false;};this.num++;};if(done) break;};return arr;},// 快速排序QuickSort(arr) {if (arr.length <= 1) {return arr;}if (Array.isArray(arr)) {let center = parseInt(arr.length / 2);// 取中间值需要让原数组发生变化let centerNum = arr.splice(center, 1);let left = [];let right = [];for (let i = 0; i < arr.length; i++) {if (arr[i] <= centerNum) {left.push(arr[i]);} else {right.push(arr[i]);};this.num++;};//使用递归 每次取中间排完再调用两边重新排序return this.QuickSort(left).concat(centerNum).concat(this.QuickSort(right));};},// 插入排序Insert(arr) {if (!Array.isArray(arr)) return false;for (let i = 0; i < arr.length; i++) {var nowNum = arr[i]; // 记录当前的值var prevIndex = i - 1; //前面的索引//对前面进行判断while (prevIndex >= 0 && arr[prevIndex] > nowNum) {this.num++;//交换位置arr[prevIndex + 1] = arr[prevIndex];prevIndex--;}arr[prevIndex + 1] = nowNum;}return arr;},// 选择排序Select(arr) {if (!Array.isArray(arr)) return false;let temp = null;for (let i = 0; i < arr.length; i++) {//默认记录最小索引let minindex = i;for (let k = i + 1; k < arr.length; k++) {minindex = arr[k] < arr[minindex] ? k : minindex;this.num++;};//交换位置temp = arr[i];arr[i] = arr[minindex];arr[minindex] = temp;}return arr;},// 希尔排序ShellSort(arr) {let len = arr.length,temp,gap = 1;// 动态定义间隔序列,也可以手动定义,如 gap = 5;while (gap < len / 5) {gap = gap * 5 + 1;};for (gap; gap > 0; gap = Math.floor(gap / 5)) {for (var i = gap; i < len; i++) {temp = arr[i];for (var j = i - gap; j >= 0 && arr[j] > temp; j -= gap) {arr[j + gap] = arr[j];this.num++;}arr[j + gap] = temp;}}return arr;},// 归并排序MergeOne(arr) {if (arr.length < 2) {return arr;}//首先将无序数组划分为两个数组let mid = Math.floor(arr.length / 2);let left = arr.slice(0, mid);let right = arr.slice(mid, arr.length);//递归分别对左右两部分数组进行排序合并return this.MergeTwo(this.MergeOne(left), this.MergeOne(right)); },MergeTwo(left, right) {this.num++;let result = [];while (left.length > 0 && right.length > 0) {if (left[0] <= right[0]) {//如果左边的数据小于右边的数据,将左边数据取出,放在新数组中result.push(left.shift());} else {result.push(right.shift());}}while (left.length) {result.push(left.shift());}while (right.length) {result.push(right.shift());}return result;}};console.log(Sort.Bubble(data), `排序执行了${Sort.num}`);
</script>

如果看了觉得有帮助的,我是@鹏多多i,欢迎 点赞 关注 评论;
END

面向百度编程

公众号

公众号

往期文章

  • 微信小程序实现上传多张本地图片到服务器和图片预览
  • JS实用方法DataUrl转为File、url转base64
  • 微信小程序API交互的自定义封装

个人主页

  • CSDN
  • GitHub
  • 简书
  • 博客园
  • 掘金

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/256328.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)

本文实例总结了JS数组排序技巧。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 1、冒泡排序 var temp 0; for (var i 0; i < array.length; i) { for (var j 0; j < array.length - i; j) { if (array[j] > array[j 1]) { temp array[j 1]; array[j 1…

js数组按照下标对象的属性排序

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 根据数组中某个参数的值的大小进行升序 <script type"text/javascript">function compare(val) {return function (a, b) {var value1 a[val];var value2 b[val];return value1…

JavaScript-数组乱序

前言 对数组进行排序对我们来说很容易就能够实现&#xff0c;但是你有考虑过如何对一个有序的数组实现乱序&#xff0c;即随机排序吗&#xff1f; 数组乱序在实际开发过程中是可能碰到的&#xff0c;下面我们一起看看如何实现数组乱序。 欢迎关注我的微信公众号&#xff1a;前…

微信小程序:Array数组的操作

Array 对象方法 方法描述concat()连接两个或更多的数组&#xff0c;并返回结果。copyWithin()从数组的指定位置拷贝元素到数组的另一个指定位置中。entries()返回数组的可迭代对象。every()检测数值元素的每个元素是否都符合条件。fill()使用一个固定值来填充数组。filter()检…

js 数组排序

代码改变世界 Posts - 29, Articles - 0, Comments - 62 Cnblogs Dashboard Login HOMECONTACTGALLERYRSS 那时候的我github&#xff1a;https://github.com/lwzhang js中的数组对象排序 2014-04-27 19:15 by 那时候的我, 66416 阅读, 2 评论, 收藏, 编辑 一、普通数组排序…

微信小程序——数组操作 (增加删除修改遍历)map、filter、forEach、find的用法、二维数组,排序,求和、指定长度数组赋值

一、数组的操作 Array.push() ->在数组后面继续插入内容 Array.pop() ->拿走数组最后一个内容 Array…shift()->拿走数组的第一个内容 (unshift也是拿走最后一个) Array.reverse()->对数组从大到小排列 Array.sort()->对数组从小到大排列** Array.splice(起始…

js数组排序实用方法集锦

js数组排序实用方法集锦 前言&#xff1a; 据说程序员三个月就能忘记自己写的代码&#xff0c;所以最好是在有空的时候及时做些总结&#xff0c;记录下来&#xff0c;这样后边遇到类似问题的话&#xff0c;就可以直接先查看自己的博客了。写技术博客&#xff0c;对自己是一种总…

运行 100 万个并发任务究竟需要多少内存?

Laf 公众号已接入了 AI 绘画工具 Midjourney&#xff0c;可以让你轻松画出很多“大师”级的作品。同时还接入了 AI 聊天机器人&#xff0c;支持 GPT、Claude 以及 Laf 专有模型&#xff0c;可通过指令来随意切换模型。欢迎前来调戏&#x1f447; <<< 左右滑动见更多 &…

MyBatis 环境搭建+基本使用

目录 MyBatis创建MyBatis环境搭建MyBatis模式开发MyBatis 获取动态参数&#xff08;查询操作&#xff09;${} 直接替换#{} 占位符模式替换like查询&#xff08;模糊查询&#xff09;多表查询一对一的表映射一对多的表映射 增、删、改操作改操作删除操作增加操作添加用户添加用户…

Spring事务与事务传播

文章目录 一、什么是事务?二、Spring事务实现编程式事务声明式事务 三、Transactional的使用参数作用Spring事务的隔离级别事务失效的场景Transactional工作原理 四、Spring事务传播机制Spring有哪些事务传播机制&#xff1f; 一、什么是事务? 事务&#xff1a;事务是一组操…

mybatis分页中的报错

1 Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.lang.NoSuchMethodException: com.github.pagehelper.BoundSqlInterceptor.<init>() 出错的原因就是上面的那句话 Error parsing SQL Mapper Configuration…

Mybatis分页方式及实现原理

一、mybatis的4种分页方式(物理分页、逻辑分页) 1、借助Sql语句Q进行分页(物理分页) 2、拦截器分页(物理分页)通过拦截器给sq语句末尾加Eimt语句来查询 3、借助 数组Q进行分页(逻辑分页) 4、RowBounds分页插件实现分页(逻辑分页) 二、mybatis分页的原理 mybatis分页原理是&…

Ora提示词版ChatGPT机器人

Ora可以自己创建一个ChatGPT机器人&#xff0c;可以设置自己的提示词例如我创建的AI佛祖https://ora.ai/aesthetic-red-nfa4/ai%E4%BD%9B%E7%A5%96 提示词 创建机器人的时候&#xff0c;需要设定自己的提示词&#xff0c;例如&#xff1a; 假设你是佛祖&#xff0c;名字叫做释迦…

mybatis分页查询插件

1.引入jar包 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.3.0</version></dependency> 2.在mybatis的核心配置文件mybatis.xml中配置分页插件 3.使用pageHec publi…

Mybatis分页查询——四种传参方式

目录 相关导读 一、顺序传参 1. 持久层接口方法 2. UserMapper.xml映射文件新增标签 3. 新增测试方法 4. 运行结果 二、param传参 1. 持久层接口方法 2. UserMapper.xml映射文件新增标签 3. 新增测试方法 4. 运行结果 三、自定义POJO类传参 1. 自定义POJO类 2. 持…

MyBatis分页插件

目录 分页插件 Mybatis插件典型适用场景 实现思考 第一个问题 第二个问题 自定义分页插件 分页插件使用 添加pom依赖 插件注册 调用 代理和拦截是怎么实现的 PageHelper 原理 分页插件 MyBatis 通过提供插件机制&#xff0c;让我们可以根据自己的需要去增强MyBati…

Mybatis——分页

1.为什么要分页&#xff1f; 减少数据的处理量使用Limit分页 select * from user limit startIndex,pageSize;使用Mybatis实现分页&#xff0c;核心SQL 1.数据库文件-db.properties drivercom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/mybatis?useSSLfalse&…

Mybatis实现分页的三种方式

文章目录 1、Limit实现分页2、RowBounds分页&#xff08;不建议使用&#xff09;3、MyBatis分页插件PageHelper&#xff08;了解即可&#xff09; 1、Limit实现分页 sql语句 SELECT * from user limit startIndex,pageSize简单示例&#xff1a; user表 查询一&#xff1a;从第…

Mybatis的四种分页方式详解

LIMIT关键字 mapper代码 select * from tb_user limit #{pageNo}, #{pageSize} 业务层直接调用 public List findByPageInfo(PageInfo info) { return userMapper.selectByPageInfo(info); } 3&#xff0c;优点 灵活性高&#xff0c;可优化空间大 mysql分页语句优化 4&…

mybatis实现分页的几种方式

本文目录 借助数组进行分页借助Sql语句进行分页拦截器分页RowBounds实现分页 借助数组进行分页 原理&#xff1a;进行数据库查询操作时&#xff0c;获取到数据库中所有满足条件的记录&#xff0c;保存在应用的临时数组中&#xff0c;再通过List的subList方法&#xff0c;获取到…