js之排序算法简洁

article/2025/11/9 11:34:41

1、冒泡排序
1.1从右往左两两比较,把每轮的最小值放在了arr[i].
双重for循环
外层循环:定位。 内层:比较交换。
最好时间复杂度:O(n)
最差时间复杂度:O(n^2)
平均时间复杂度:O(n^2)
空间复杂度:O(1).
稳定

//从右往左两两比较,把每轮最小的放在了arr[i]
function bub(arr){let len = arr.length;for(let i=0;i<len;i++){let flag = false;for(let j=len-1;j>i;j-- ){if(arr[j]<arr[j-1]){swap(arr,j-1,j);flag = true}}//没有交换 说明已经排好序了if(!flag) return arr;}return arr
}
function swap(arr,i,j){temp = arr[i];arr[i]=arr[j];arr[j]=temp;
}
let arr = [2,1,4,6,5];
console.log(bub(arr));

1.2从左往右两两比较,把每轮的最大值放在了最右 arr[len-i]。

//从左往右两两比较,把每轮最大放在了最右 arr[len-i]
function bub(arr){let len = arr.length;for(let i=0;i<len;i++){let flag = false;for(let j=0;j<len-i-1;j++){if(arr[j]>arr[j+1]){swap(arr,j,j+1);flag = true;}}//没有交换 说明已经排好序了if(!flag) return arr}return arr;
}
function swap(arr,i,j){temp = arr[i];arr[i]=arr[j];arr[j]=temp;
}
let arr = [2,1,4,6,5];
console.log(bub(arr));

2、选择排序
每轮获取得到最小值的下标,如果这个下标不是当前i,就将这两个值交换。
双重for循环
外层循环:定位。 内层:找最值。
最好时间复杂度:O(n^2)
最差时间复杂度:O(n^2)
平均时间复杂度:O(n^2)
空间复杂度:O(1)。
不稳定。

function selectsort(arr){let len = arr.length;let min;for(let i=0;i<len;i++){min = i;for(j=i+1;j<len;j++){if(arr[j]<arr[min]){min = j;}}if(min!=i){swap(arr,i,min);}}return arr;
}
function swap(arr,i,j){var temp =arr[i];arr[i] = arr[j];arr[j] = temp;
}
let arr = [2,1,4,6,5];
console.log(selectsort(arr));

3、直接插入排序
当前 i 往它的左边看,不合适的往后移,腾出一个位置可插入,不断去找这个值应该插在什么位置。
双重for循环
外层循环:定位。 内层:与前元素比较腾空位。

最差时间复杂度:O(n^2)
平均时间复杂度:O(n^2)
空间复杂度:O(1)

function insertsort(arr){let len = arr.length;var i,j;for( i = 1;i<len;i++){let val = arr[i];for( j=i-1;j>=0;j--){if(arr[j]<val){break;//val已经大于它左边的第一个a[j],退出第二个for}//arr[j]>val  不用判断直接腾位置吧arr[j+1]=arr[j];//a[j]比val大,a[j]往后腾位置}
//一直往左看,找到合适的位置时a[j]一定要比val小,val就应该在腾出的a[j+1]w位置arr[j+1]=val;//val找到它该放的位置}return arr
}
let arr = [2,1,4,6,5];
console.log(insertsort(arr));

另一种写法更容易理解:

function insertsort(arr){let len = arr.length;var i,j;for( i = 1;i<len;i++){//只有当前i的值比前面左边的小,才需要腾位置if(arr[i]<arr[i-1]){val = arr[i];for(j=i-1;j>=0&&val<arr[j];j--){arr[j+1]=arr[j];//腾位置}arr[j+1]=val;}}return arr
}
let arr = [2,1,4,6,5,3];
console.log(insertsort(arr));

4、希尔排序
是对直接插入排序的改进。

function shellsort(arr){let len = arr.length;let d=parseInt(len/2);let i,j;for(d;d>=1;d=parseInt(d/2)){for( i = d;i<len;i++){if(arr[i]<arr[i-d]){val = arr[i];for(j=i-d;j>=0&&val<arr[j];j-=d){arr[j+d]=arr[j];}arr[j+d]=val}}}return arr;
}
let arr = [8,4,5,7,1,3,6,2,4];
console.log(shellsort(arr));

5、折半插入排序
当low = high时最后一次进入while ,mid=low=high 最后只有两种情况:
1、arr[mid]>val ,val 应该在前面。也就是在mid的位置。此时经过if判断high = mid-1,left还是mid,left>high退出循环。,取mid=low=high+1
2、arr[mid]<val, val应该在后面。也就是在mid+1的值位置。此时经过if判断,low=mid+1>,high还是mid,low>high退出循环。取mid+1 = low = high+1
所以不管哪种情况,val的位置就是low,或者说是high+1。

function insertsort(arr){var len = arr.length;var low,high;var i,j;for( i = 1;i<len;i++){low = 0,high = i-1;let val = arr[i];while(low<=high){mid = Math.floor((low+high)/2);if(arr[mid]>val) high = mid-1;else low = mid+1;}//low的位置就是它该放的for( j=i-1;j>=low;j--){//腾出low值的位置arr[j+1]=arr[j];}arr[low]=val;}return arr
}
let arr = [2,1,4,6,5,3,1,2,6,8,4,9,7,3];
console.log(insertsort(arr));

6、归并排序
分而治之策略。
双重for循环
最差时间复杂度:O(nlogn)
平均时间复杂度:O(nlogn)
空间复杂度:O(n).
在这里插入图片描述

function mergesort(arr){let len = arr.length;//不断拆分至只有一个数if(len<=1) return arr;let mid=Math.floor(len/2);let left = arr.slice(0,mid);let right = arr.slice(mid);return merge(mergesort(left),mergesort(right))
}
//合并左右数组
function merge(leftarr,rightarr){let res = [];let i=0,j=0;while(i<leftarr.length&&j<rightarr.length){if(leftarr[i]<rightarr[j]){res.push(leftarr[i++]);}else{res.push(rightarr[j++]);}}//不知道哪个剩余,将剩余拼接return res.concat(leftarr.slice(i)).concat(rightarr.slice(j));}
let arr = [8,4,5,7,1,3,6,2];
console.log(mergesort(arr));

7、快速排序

最差时间复杂度:O(n^2)
平均时间复杂度:O(nlogn)
空间复杂度:O(nlogn).
不稳定

        function partition(arr,low,high){let pivot= arr[low];//基准while(low<high){//从右往左,右边是要大于pivot的while(low<high &&arr[high]>=pivot){high--;//满足大于pivot,继续往左}//当出现小于pivot的值,退出该while,并且要把该值放在左边。这时的high位置的值是要留给大于pivot的值arr[low]=arr[high];//暂存这个小于pivot的数, 原来的arr[low]值已经用pivot保存//开始从左往右,左边是要小于pivot的while(low<high&&arr[low]<=pivot){low++;//满足小于pivot,继续往右}//当出现大于pivot的值,退出该while,并且要把该值放在右边。这时的lowarr[high]=arr[low];//把该大于pivot的值放在第一个while留的位置。  }arr[low]=pivot;return low;}function quickSort(arr,left,right){if(left<right){var mid = partition(arr,left,right);  //确定划分中间位置quickSort(arr,left,mid-1);   //对左边部分进行递归quickSort(arr,mid+1,right);   //对右边部分进行递归}}var arr=[1,12,6,3,5,8,2,7,9];quickSort(arr,0,arr.length-1);console.log(arr);

http://chatgpt.dhexx.cn/article/bMAhrbTR.shtml

相关文章

JavaScript算法-排序算法

​ 此生之路&#xff0c;我将走过&#xff1b;走过这一次&#xff0c;便再也无法重来。所有力所能及的善行&#xff0c;所有充盈于心的善意&#xff0c;我将毫不吝惜&#xff0c;即刻倾予。我将再不拖延&#xff0c;再不淡漠&#xff0c;只因此生之路&#xff0c;再也无法重来。…

一个简单的js快速排序算法

简介&#xff1a; 快速排序是对冒泡排序的一种改进。它的基本思想是&#xff1a; 通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另外一部分的所有数据都要小&#xff0c;然后再按此方法对这两部分数据分别进行快速排序&#xff0c;整个排…

js排序算法详解-插入排序

全栈工程师开发手册 &#xff08;作者&#xff1a;栾鹏&#xff09; js系列教程5-数据结构和算法全解 js排序算法详解-插入排序 插入排序的原理其实很好理解&#xff0c;可以类比选择排序。选择排序时在两个空间进行&#xff0c;等于说每次从旧的空间选出最值放到新的空间&am…

JS 常见排序算法汇总(全)

文章目录 排序算法总结JS 十大排序算法冒泡排序单向冒泡双向冒泡选择排序插入排序快速排序归并排序桶排序基数排序计数排序 排序算法总结 JS 十大排序算法 冒泡排序 作为最简单的排序算法之一&#xff0c;冒泡排序感觉就像Abandon在单词书里出现的感觉一样&#xff0c;每次都…

常用排序算法(js)

复习排序算法 时间复杂度、空间复杂度、稳定新 排序算法时间复杂度空间复杂度稳定性冒泡O(n^2)O(1)是选择O(n^2)O(1)不是插入O(n^2)O(1)是希尔O(nlogn)O(1)不是快速O(nlogn)O(nlogn)不是 1. 冒泡排序 思路&#xff1a;每一轮都对相邻的两个元素进行比较&#xff0c;如果逆序…

JS实现快速排序算法

快速排序的基本思想是选择数组中的一个元素作为关键字&#xff0c;通过一趟排序&#xff0c;把待排序的数组分成两个部分&#xff0c;其中左边的部分比所有关键字小&#xff0c;右边的部分比所有关键字大。然后再分别对左右两边的数据作此重复操作&#xff0c;直到所有元素都有…

JavaScript排序算法专栏(JS十大排序算法详解)

一、冒泡排序 1、Explanation And Steps&#xff08;解释的步骤&#xff09; 冒泡排序&#xff08;Bubble Sort&#xff09;也是一种简单直观的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。走访数列的…

JS实现经典的排序算法

几大经典排序算法实现&#xff1a; 1.排序算法介绍&#xff1a; 2.基本算法 2.1 冒泡排序 function bubbleSort(arr) {var len arr.lengthfor (var i 0; i < len; i) {for (var j 0; j < len - 1 - i; j) {if (arr[j] > arr[j 1]) {;[arr[j], arr[j 1]] [arr…

js实现常见排序算法

文章目录 前言一、排序相关概念1.比较排序和非比较排序比较排序非比较排序 2.稳定性和不稳定性 二、各排序算法对比三、排序算法中的通用函数以及对数器1.通用函数交换函数取两索引的中间下标&#xff0c;中间值mid 2.对数器 四、各排序算法的实现1.冒泡排序算法思想过程图解代…

js-常见排序算法

目录 一、选择排序 二、冒泡排序 三、插入排序 1. 希尔排序 四、归并排序 五、快速排序 版权声明&#xff1a;本文为博主原创文章&#xff0c;若文章中有错误请联系博主改正&#xff0c;请不要恶意留言(不喜欢请绕道)。欢迎大家转载&#xff0c;转载时请注明原文地址:https://b…

3.JS排序算法之选择排序

选择排序&#xff08;selectSort&#xff09;&#xff0c;顾名思义&#xff0c;每次选择最值进行排序 目录 一、选择排序算法原理 二、选择排序算法分析 三、选择排序算法应用实例 四、选择排序的适用场景 一、选择排序算法原理 1.思路 选择排序的实现思路是从未排序序列中…

JavaScript实现十大排序算法(图文详解)

冒泡排序 排序的效果图 解法 当前解法为升序 冒泡排序的特点&#xff0c;是一个个数进行处理。第i个数&#xff0c;需要与后续的len-i-1个数进行逐个比较。 为什么是 len-i-1个数&#xff1f; 因为数组末尾的i个数&#xff0c;已经是排好序的&#xff0c;确认位置不变的了。…

JS 常见的排序算法

工作中算法不常用&#xff0c;但是排序经常用。因此在这里整理了几种JS中常见的排序算法。 冒泡排序 1、算法思想&#xff1a;判断两个相邻元素&#xff0c;大于则交换位置 2、算法步骤 从数组中第一个数开始&#xff0c;依次与下一个数比较并次交换比自己小的数&#xff0c…

详细解析十大排序算法(js实现)

详细解析十大排序算法js实现 算法概述1.冒泡排序1.1算法描述1.2动图演示1.3代码实现 2.选择排序2.1算法描述2.2动图演示2.3代码实现2.4算法分析 3.插入排序3.1算法描述3.2动图演示3.3代码实现3.4算法分析 4.希尔排序4.1算法描述4.2动图演示4.3代码实现4.4算法分析 5.归并排序5.…

Excel中使用SUMIFS公式时计算结果不正确(原因:有超过15位数字的长编码)

在使用SUMIFS公式进行多条件求和时发现求和结果部分正确&#xff0c;部分错误。 常见原因&#xff1a; 1、公式错误 2、数据格式有问题或者有空格等 仔细检查后发现并不是上述两个原因&#xff0c;而是求和的公式中涉及到超过15位数字的长编码。常见的SUMIF、SUMIFS、COUNTIF等…

mybatis-plus使用

1 mybaitsplus简介 &#xff08;1&#xff09;对于mybatis功能的增强&#xff0c;具体的体现就是对于单表的操作都生成好了&#xff0c;分页&#xff0c;条件查询使用很方便&#xff0c;例如查询操作&#xff0c;直接使用wrapper的实现类&#xff0c;调用方法进行条件的增加&a…

四、Hibernate框架的API (三)-- Session对象

一、Session对象 1.Hibernate最重要的对象,只用使用hibernate与数据库操作&#xff0c;都用到这个对象2.该对象维护了一个Connection对象。代表了与数据库连接的会话。3.该对象实质上是对Connection对象的包装&#xff0c;在Connection对象基础之上&#xff0c;封装了一些方法。…

Criteria的用法

一、Hibernate提供了5种检索对象的方式 1.导航对象图检索方式&#xff1a;根据已经加载的对象导航到其他对象    from Emp e group by e.dept.deptName 2.OID检索方式&#xff1a;按照对象的OID来检索对象   get/load 3.HQL检索方式&#xff1a;使用面向对象的HQL查询语…

第13章:处理Excel电子表格(笔记)

13.1&#xff1a;Excel文档 13.2&#xff1a;安装openpyxl模块 pip install --user --Uopenpuxl2.6.2 这是安装2.6.2版本的&#xff0c;比较新的版本与学习的书籍的信息有一点不兼容 13.3&#xff1a;读取Excel文档 13.3.1&#xff1a;用openpyxl模块打开Excel文档 import …

关于 range.autofilter 和 VBA的 filter

1 range().autofilter容易出错的地方 1.1 range().autofilter的返回值 range().autofilter 返回值总是 true返回值并不是对象&#xff0c;而是执行一个筛选的操作所以 Sub test1_filter5() Dim rng1 As Range Set rng1 Range("b1:b20").AutoFilter(field:1, Crit…