一、冒泡排序
实现原理:
数组中有 n
个数,比较每相邻两个数,如果前者大于后者,就把两个数交换位置;这样一来,第一轮就可以选出一个最大的数放在最后面;那么经过 n-1
(数组的 length - 1) 轮,就完成了所有数的排序。
执行完当前代码浏览器输出:
可得出结论目前数组最后一位为数组中的最大值,那么我们这样循环list.length-1次就可以使得数组按从小到大的顺序排好。
通过以上输出可以总结出外层每循环一次,就能让倒数第n大的数字排好序,所以内层循环可以优化,排除已经排好序的数字,
但是还有一种情况,如果list =[1,2,4,3],其实循环完第一轮的时候就已经排好序了,但是下面的代码还是继续执行,为了提高效率,我们可以加一个标识字段,如果某次循环完后,没有任何两数进行交换,就将标志位 设置为 true,表示排序完成,这样我们就可以减少不必要的排序,提高性能。
所以代码可以优化为
可以看到这时候只循环了一次,提高了效率,到此冒泡排序优化完成。
二、快速排序
1.快速排序的三个原理
(1)从数组中选择其中一个元素为基准点
(2)排序数组,比基准值小的放左边,比基准值大的放右边,每次分割结束基准值放到中间
(3)利用递归,将基准值左右两边的数组进行步骤1和2的操作,排序数组。
缺点:
- 获取基准点使用了一个splice操作,在js中splice会对数组进行一次拷贝的操作,而它最坏的情况下复杂度为O(n),而O(n)代表着针对数组规模的大小进行了一次循环操作。
- 首先我们每次执行都会使用到两个数组空间,产生空间复杂度。
- concat操作会对数组进行一次拷贝,而它的复杂度也会是O(n)
- 对大量数据的排序来说相对会比较慢