网站首页 > 技术文章 正文
插入排序
算法描述:
从第一个元素开始,该元素可以认为已经被排序
取出下一个元素,在已经排序的元素序列中从后向前扫描
如果该元素(已排序)大于新元素,将该元素移到下一位置
重复步骤 3,直到找到已排序的元素小于或者等于新元素的位置
将新元素插入到该位置后
重复步骤 2~5
var arr = [5, 6, 3, 1, 8, 7, 2, 4];for(let i = 1;i<arr.length;i++){ let myIndex = i; console.log('次数:'+i); for(let j = i-1 ; j >= 0 ; j -- ){ console.log('单次比较数据:'+arr[myIndex]+'---'+arr[j]) if(arr[myIndex] < arr[j]){ [arr[myIndex],arr[j]] = [arr[j],arr[myIndex]]; myIndex = j; }else{ break; } console.log('数组'+arr); } }
时间复杂度 O(n^2)
运行过程
选择排序
算法描述
直接从待排序数组中选择一个最小(或最大)数字,放入新数组中。
假定第一个数字是最小的,然后依次和后面的比较,哪个小哪个就记录当前那个的下标。
记录完下标了之后替换第一个和那个最小数字的位置
依次执行上述步骤,只不过最小的位置依次累加
var arr = [5, 6, 3, 1, 8, 7, 2, 4];for(let i = 0; i < arr.length - 1;i++){ console.log('次数'+Number(i+1)) let minIndex = i; for(let j = i ;j < arr.length - 1; j++){ console.log('单次比较数据:'+arr[minIndex]+'---'+arr[j+1]) if(arr[minIndex] > arr[j+1]){ minIndex = j+1; } } [arr[minIndex],arr[i]] = [arr[i],arr[minIndex]]; console.log('数组'+arr); }
时间复杂度 O(n^2)
运行过程
冒泡排序
就几种算法来看,感觉冒泡是比较慢的
算法描述:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
var arr = [5, 6, 3, 1, 8, 7, 2, 4]; let count = 0; for(let i = arr.length ; i > 0; i --){ console.log('次数'+i); for(let j = 1; j < i; j ++){ console.log('单次比较数据:'+arr[j]+'----'+arr[j-1]) if(arr[j] < arr[j-1]){ [arr[j],arr[j-1]] = [arr[j-1],arr[j]] } } console.log(arr); }
时间复杂度 O(n^2)
运行过程
归并排序
归并排序的图可能一下看不懂,是因为图代表的是运行的过程,主要看算法描述
归并排序:其基本思想是分治策略,先进行划分,然后再进行合并。
假设要对数组C进行归并排序,步骤是:
1.先将C划分为两个数组A和B(即把数组C从中间分开)
2.再分别对数组A、B重复步骤1的操作,逐步划分,直到不能再划分为止(每个子数组只剩下一个元素),这样,划分的过程就结束了。
如: [12 20 30 21 15 33 26 19 40 25]
划分为: [12 20 30 21 15] [33 26 19 40 25]
[12 20] [30 21 15] [33 26] [19 40 25] [12] [20] [30] [21 15] [33] [26] [19] [40 25] [12] [20] [30] [21] [15] [33] [26] [19] [40] [25]
3.然后从下层往上层不断合并数组,每一层合并相邻的两个子数组,合并的过程是每次从待合并的两个子数组中选取一个最小的元素,然后把这个元素放到合并后的数组中,不断重复直到把两个子数组的元素都放到合并后的数组为止。
4.依次类推,直到合并到最上层结束,这时数据的排序已经完成了。
var arr = [5, 6, 3, 1, 8, 7, 2, 4,9];function mergeSort(arr){ if(arr.length === 1){ return arr; } let midIndex = Math.floor(arr.length / 2); let leftArr = arr.slice(0,midIndex); let rightArr = arr.slice(midIndex); console.log('拆分数组'+leftArr+'------'+rightArr) return mergeFn(mergeSort(leftArr),mergeSort(rightArr)); }.function mergeFn(left,right){ let tmp = []; console.log(left + '----' + right); while (left.length && right.length) { console.log('单次比较数据:'+left[0]+'和'+right[0]+'谁小谁所在的数组就被shift掉一个') if (left[0] < right[0]){ tmp.push(left.shift()); } else{ tmp.push(right.shift()); } console.log(tmp); } let arra = tmp.concat(left, right); console.log('本次比较完毕:'+arra); return arra; } mergeSort(arr);
时间复杂度 O(nlogn)
运行过程,看了运行过程就能看懂图了,也知道js函数里的参数有函数的情况下的执行顺序是自左向右
快速排序
图上的运行方式是按照基准是第0号位算的,看起来稍微有点乱,不过只要知道快排是怎么算的就好了
算法描述:
在数据集之中,选择一个元素作为”基准”(pivot)。
所有小于”基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到”基准”的右边。这个操作称为分区 (partition)操作,分区操作结束后,基准元素所处的位置就是最终排序后它的位置。
对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
var arr = [5, 6, 3, 1, 8, 7, 2, 4];function quickSort(arr){ if(arr.length <= 1){ return arr; } //找基准 let midIndex = Math.floor(arr.length/2); //剔除基准值 let midNum = arr.splice(midIndex,1)[0]; console.log('基准值:'+midNum); let leftArr = [],rightArr=[]; for(let i = 0 ; i < arr.length; i++){ //小于基准的进左边,大于的进右边 arr[i] < midNum ? leftArr.push(arr[i]) : rightArr.push(arr[i]) } console.log('小于基准值的数组:'+leftArr); console.log('大于基准值的数组:'+rightArr); return quickSort(leftArr).concat(midNum,quickSort(rightArr)); } quickSort(arr);
时间复杂度 O(nlogn)
运行过程
这个运行过程是按照基准为0号位算的;
猜你喜欢
- 2025-06-13 8个步骤,创建项目管理时间表(建立项目管理系统)
- 2025-06-13 配电柜里最全电气原件 安装 排序 电气元件名称 让你一目了然 电工必备
- 2025-06-13 html基础必备-列表标记,前端小白一看就会
- 2025-06-13 家族坟墓的多种排列形式,墓葬布局的排列布局(图解)
- 2024-10-03 17种编程语言实现排序算法-插入排序
- 2024-10-03 前端工程师算法系列(4)-归并排序 归并排序js代码
- 2024-10-03 插入排序java java排序实现
- 2024-10-03 插入排序算法 插入排序算法c语言
- 2024-10-03 十大排序算法(javascript) 十大排序算法c语言
- 2024-10-03 常考算法题:无重复字符串的排列组合
你 发表评论:
欢迎- 519℃Oracle分析函数之Lag和Lead()使用
- 518℃几个Oracle空值处理函数 oracle处理null值的函数
- 514℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 504℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 501℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 491℃【数据统计分析】详解Oracle分组函数之CUBE
- 470℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 470℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端富文本编辑器 (47)
- 前端路由 (61)
- 前端数组 (73)
- 前端排序 (47)
- 前端定时器 (47)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)