1. 快速排序
原理:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使整个数据变成有序序列。
实现步骤:
- 选择一个基准元素
target(一般选择第一个数); - 将比
target小的元素移动到数组左边,比target大的元素移动到数组右边; - 分别对
target左侧和右侧的元素进行快速排序;
从上面的步骤中我们可以看出,快速排序也利用了分治的思想(将问题分解成一些小问题递归求解)选择一个基准元素target(一般选择第一个数)
function quickSort(array) {if (array.length === 1) return arrayconst target = array[0]const left = []const right = []for (let i = 0; i < array.length; i++) {if (array[i] < target) {left.push(array[i])} else {right.push(array[i])}}return quickSort(left).concat([target], quickSort(right))}
- 时间复杂度:平均
O(nlogn),最坏O(n2),实际上大多数情况下小于O(nlogn); - 空间复杂度:
O(logn)(递归调用消耗)
2. 冒泡排序
原理:循环数组,比较当前元素和下一个元素,如果当前元素比下一个元素大,向上冒泡。这样一次循环之后最后一个数就是本数组最大的数。下一次循环继续上面的操作,不循环已经排序好的数。
优化:当一次循环没有发生冒泡,说明已经排序完成,停止循环。
function bubbleSort(array) {for (let j = 0; j < array.length; j++) {let complete = truefor (let i = 0; i < array.length - 1 - j; i++) {if (array[i] > array[i+1]) {[array[i], array[i+1]] = [array[i+1], array[i]]complete = false}}if (complete) {break}}return array}
- 时间复杂度:
O(n^2) - 空间复杂度:
O(1)
