JavaScript --数据排序算法(2)
选择排序
算法思想:从所有记录中选出最小的一个数据元素与第一个位置的记录交换;
然后在剩下的记录当中再找最小的与第二个位置的记录交换,循环到只剩下最后一个数据元素为止。
---上代码----
let arrTemps = [3, 2, 11, 9, 2, 15, 19, 19, 16, 1, 8] function select(arr) { var currentIndex; //当前记录的初始位置 var temp; //换值容器 var len = arr.length; for (var i = 0; i < len; i++) { currentIndex = i //默认是最外层的 for (var j = i + 1; j < len; j++) { if (arr[j] < arr[currentIndex]) { // 将记录的值 再依次进行对比 确认出最小值的位置并记录 // 如果要更换成降序的话 换成大于即可 currentIndex = j } } // 交换位置 // 将最外层的循环的值 与对比获取的位置进行交换 temp = arr[i] arr[i] = arr[currentIndex] arr[currentIndex] = temp } return arr } console.log(select(arrTemps), '选择排序');
这个有点类似冒泡排序,冒泡排序是相邻的比较,选择排序是在当前位置与后面的所有进行比较取出当前的最大值/最小值
插入排序
算法思想:从待排序的n个记录中的第二个记录开始,依次与前面的记录比较并寻找插入的位置, 每次外循环结束后,将当前的数插入到合适的位置。
---上代码----
let arrTempsp = [2, 3, 11, 9, 2, 15, 19, 19, 16, 1, 8] function insert(arr) { for (let i = 0; i < arr.length; i++) { let item = arr[i]; //当前对比的值 let j = i - 1 //往当前位置前一位的位置 while (arr[j] > item) { //升序 // 要插入的值 进行对比 大于的话 直接交换位置,整体向右移位 //降序 换成 小于 arr[j + 1] = arr[j]; j--; //记录当前位置往前 } // 插入记录位置的后一位索引 arr[j + 1] = item } return arr } console.log(insert(arrTempsp), '插入排序');
插入排序是从第二个起,每次都是往前进行查找相应的位置进行插入,有点类似于来一个元素 在之前排好的元素中进行插入
归并排序
算法思想:将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并
---上代码----
let arrTe = [2, 3, 11, 9, 2, 15, 19, 19, 16, 1, 8] function merge(arr) { if (arr.length <= 1) { //使用递归的,结束条件 return arr } let mid = Math.floor(arr.length / 2) let left = merge(arr.slice(0,mid)) //进行递归二分,形成最小的单元 let right = merge(arr.slice(mid)) //进行递归二分 console.log(left,right); // 排序 最小单元是数组的形式 function sort(left,right){ let result=[] while(left.length>0&&right.length>0){ // 对比数组的第一个 小的那个数组截取第一个 添加到result中 // 直至一个数组为空 跳出循环 if (left[0]>right[0]) { result.push(left.shift()) }else{ result.push(right.shift()) } } // result是排序好的单元,在left 或right中存在一个最大值 需要拼接在一起 return [...result,...left,...right] } return sort(left,right) } console.log(merge(arrTe), '归并排序');
归并排序有点像快速排序,进行二分的 递归的形式,实现最小单元的排序,最终合并成。
小编用的相对比较多的还是前面的两种--冒泡排序和快速排序
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下