dushine00 2019-06-26
实际生活中我们需要对很多数据进行处理,排序就是其中之一。而面试的时候一些排序算法、设计模式也是很多面试官的青睐,所以我们更需要理解这些常用的排序算法的思路(实现原理),排序的代码就不在文章内贴出来了(想看的各位请点相应的链接)。
Talk is cheap, show me the code.
本文使用100个0~99的不重复的随机数组成的数组:
function notInArrNum(arr){ var num = Math.floor(Math.random()*100); // 生成一个随机数 // 如果存在于数组中 -> 递归调用 // 否则将这个随机数返回 if(arr.indexOf(num) != -1){ num = notInArrNum(arr); } else { return num; } } // 生成随机数数组 function randomArr() { var count = 0; var arr = []; while(count < 100) { var a = notInArrNum(arr); arr.push(a); count++; } return arr; }
算法思路:
效果图:
图上的灰色矩形代表着正在进行步骤2操作的区域,与深蓝色水平线持平的黑块所在的就是基准值。
复杂度:
一般情况下复杂度为O(nlogn)
,最糟糕情况为O(n^2)
算法思路:
比较相邻的两个数,如果前者比后者大,则将它们的位置互换。对所有元素持续递归。
效果图:
复杂度:
一般情况下的复杂度和最糟糕的复杂度都为O(n^2)
算法思路:
效果图:
暂无
复杂度:
同冒泡排序
算法思路:
首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾,递归执行该操作。
效果图:
复杂度:
一般情况下和最糟糕情况的复杂度都为n^2
其实这四个排序算法都是蛮简单的,不过之前都没有怎么去理解它们。另外还有一些在这些算法的基础上进行优化的排序算法例如shell排序、堆排序等等,有兴趣的各位也可以看看。
之后的算法系列可能是Codewars上的,也有可能是经常用上的。另外希望大家多多批评指正,Thanks!
原文地址:点击此处
要知道时间复杂度只是描述一个增长趋势,复杂度为O的排序算法执行时间不一定比复杂度为O长,因为在计算O时省略了系数、常数、低阶。实际上,在对小规模数据进行排序时,n2的值实际比 knlogn+c还要小。