摘要:由于排序的算法有很多,在本次算法系列的分享当中,我们先从简单易上手的选择排序法开始,其它的排序算法会随后陆续跟大家一起分享。
算法的基本概念 算法是什么,它有何作用HTML5学堂-码匠:数据快速的计算与排序,与前端页面性能有直接的关系。由于排序的算法有很多,在本次“算法系列”的分享当中,我们先从简单易上手的选择排序法开始,其它的排序算法会随后陆续跟大家一起分享。
为解决一个问题而采取的方法和步骤,称为算法。
我们可以把算法看成一本“福字剪纸教程”,其中每一种算法就是剪纸教程中的一种包含“固定步骤”的剪纸方法,使用者只要按照步骤进行剪纸,就可以剪出好看的福字。
之所以有这么多的算法,在于不同算法解决问题的效率各有不同,适合不同的场景。随着问题规模的增长,算法之间的差距会变的不可跨越。提升解决问题的效率,不仅仅依赖于选择快速的硬件,还依赖于选择有效(适合)的算法。
针对数组进行从大到小(或从小到大)的排序。例如:管理系统中按照成绩的排序,按阅读量对文章的排序等。
数据快速的计算与排序,与前端页面性能有直接的关系。(譬如在页面中有10000条的数据需要靠JS进行排序,采用不同的算法所消耗的时间差距甚大,直接影响着网站的用户体验)
较为常见的排序方法,包括:冒泡排序、选择排序、快速排序、二分法插入排序等。
由于排序的算法有很多,在本次“算法系列”的分享当中,我们先从简单易上手的选择排序法开始,其它的排序算法会随后陆续跟大家一起分享。
先找到序列中最小的数,将它和序列中第一个数交换位置;
接下来,在剩下的序列中继续此操作:找到最小的数,将它和序列中的第二个数交换位置;
依此类推,直到将整个序列排序完成。
简言之,选择排序就是 —— 不断地选择剩余序列中的最小者,然后与未排序数列的“第一个”数字交换位置。
排序次数:序列长度 – 1(注意,不是比较次数);
因为序列中的最后一个数不需要再次比较大小,故排序次数为 序列长度 – 1。
序列中找到最小的数,并记录该数的索引值;
因为minIndex默认开始为0,则第一个数无需与自身比较,所以j = i + 1;
// 遍历序列,找到最小的数 for (var j = i + 1; j < len; j++) { if (arr[j] < arr[minIndex]) { // 记录最小数的索引 minIndex = j; }; };
在排序次数内多次遍历找到最小的数,因此需要再用一个for语句来进行控制。
// 排序次数 for (var i = 0; i < len - 1; i++) { // 默认最小数的索引为i minIndex = i; // 遍历序列,找到最小的数 for (var j = i + 1; j < len; j++) { if (arr[j] < arr[minIndex]) { // 记录最小数的索引 minIndex = j; }; }; };两数交换位置
利用temp变量,实现两数组元素之间数值的交换,也就是交互位置。
temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp;选择排序法完整代码
var arr = [9, 8, 3, 1, 2, 4], len = arr.length, minIndex, temp; // 排序次数 for (var i = 0; i < len - 1; i++) { // 默认最小数的索引为i minIndex = i; // 遍历剩下的序列,找到最小的数 for (var j = i + 1; j < len; j++) { if (arr[j] < arr[minIndex]) { // 记录最小数的索引 minIndex = j; }; }; // HTML5学堂出品 // 两数交互位置 temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; }; console.log(arr);
选择排序法的效率 算法复杂度的基本概念欢迎沟通交流~~~HTML5学堂(码匠)
算法复杂度分为时间复杂度和空间复杂度(时间和空间是计算机最重要的资源,因此复杂度分为时间和空间)。
时间复杂度:指执行算法所需要的计算工作量;
空间复杂度:指执行算法所需要的内存空间。
时间复杂度是总运算次数表达式中受n的变化影响最大的项(不含系数);
第一次循环比较n-1次,然后是n-2次,n-3次,依此类推,最后一次循环比较1次,总的比较次数和为(n - 1 + 1) * n / 2,即进行比较操作的时间复杂度为O(n^2)
Tips:选择排序的比较次数与序列的初始排序无关。
排序算法需要一个额外的空间(temp变量)来交换元素的位置。
不稳定排序的一种算法选择排序是一种不稳定排序的算法。
比如:序列[3, 8, 3, 1, 9 ],第一次循环第1个元素3会和1交换,变成[1, 8, 3, 3, 9],此时,原序列中两个3的先后顺序被破坏。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/84818.html
摘要:今天跟大家分享多种排序算法里使用较广泛,速度快的排序算法快速排序法平均时间复杂度为。快速排序法的原理快速排序是一种划分交换排序,它采用分治的策略,通常称其为分治法。 HTML5学堂-码匠:前几期算法之旅跟大家分享了冒泡排序法和选择排序法,它们都属于时间复杂度为O(n^2)的慢排序。今天跟大家分享多种排序算法里使用较广泛,速度快的排序算法—— 快速排序法 [ 平均时间复杂度为O (n l...
摘要:学堂码匠本期继续走入算法冒泡排序法。冒泡排序法完整代码冒泡排序法的优化假如序列的数据为使用上面的冒泡排序法进行排序,得到的结果肯定没有问题,但是,待排序的序列是有序的,理论上是无需遍历排序。 HTML5学堂-码匠:本期继续走入算法 —— 冒泡排序法。冒泡排序算法相对简单,容易上手,稳定性也比较高,算是一种较好理解的算法,也是面试官高频提问的算法之一。 Tips:关于算法及排序的基础知识...
阅读 1482·2023-04-25 15:40
阅读 2833·2021-08-11 11:15
阅读 2272·2019-08-26 13:48
阅读 2843·2019-08-26 12:18
阅读 2447·2019-08-23 18:23
阅读 2904·2019-08-23 17:01
阅读 2977·2019-08-23 16:29
阅读 1100·2019-08-23 15:15