正文
Array.prototype.sort
原生 JS 自身的排序算法 sort()
,有其本身的优缺点;
1 | let arr = [1, 20, 10, 22, 11, 24, 100] |
直接调用会将元素转化成字符串进行排序;可通过传入内部函数来实现升序或排序,内部算法同样是快速排序,在实现上肯定是比我们所使用的快速排序复杂的多,主要是做了性能上的优化。所以,我们可以放心的使用 Array.prototype.sort()
进行排序。
冒泡排序(Bubble Sort)
原理:如名字一般,泡泡越往上越大,循环遍历,每次循环找出一个最大值往最后放;
思路:如图,每次循环能找出一个最大值,每次循环里得比较所有剩余元素,所以需要嵌套循环,一次为比较的轮数(arr.length - 1),一次为每轮的比较次数 (arr.length - 1 - i 已经比较的轮数);每次比较前元素比后元素大则交换位置;
性能:
- 时间复杂度:平均时间复杂度是
O(n^2)
- 空间复杂度:由于辅助空间为常数,所以空间复杂度是
O(1)
代码:
1 | function bubbleSort(arr) { |
插入排序(Insert Sort)
原理:构建有序数列,对未排序元素,在有序数列中的元素从后向前扫描(正向亦可),找到位置并插入;(原理如抽牌一般,抽牌与手中的牌比较,找到位置插入)
思路:嵌套循环,外循环遍历未排序数组,里循环遍历有序数组,未排序元素与有序数组元素从后往前比较,比有序元素大则往后插入,并跳出内循环,继续比较未排序元素;
性能:
- 时间复杂度:平均算法复杂度为
O(n^2)
- 空间复杂度:辅助空间为常数,空间复杂度是
O(1)
代码:
1 | function insertSort(arr) { |
快速排序(Quick Sort)
原理:快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的 2 个子序列,然后递归地排序两个子序列。
思路:挑选一个元素作为基准值,循环遍历整个数组,每个元素与基准值比较,分为两个数组,此时递归这两个数组,直到数组中的元素个数小于等于一个,则返回该数组,组合所有数组和基准值及得到有序数组;
性能:
- 时间复杂度:平均时间复杂度
O(nlogn)
- 空间复杂度:辅助空间是 logn,所以空间复杂度为
O(logn)
代码:
1 | function quickSort(arr) { |
待更新
排序算法还有很多,归并排序、希尔排序等等,后续再总结更新;