目录
一、插入排序
插入排序有直接插入排序,折半插入排序,希尔排序,这里只实现常用的直接插入排序
直接插入排序
将左侧序列看成一个有序序列,每次将一个数字插入该有序序列。
插入时,从有序序列最右侧开始比较,若比较的数较大,后移一位。
function insertSort(array) {
//第一个默认已经排好
for (let i = 1; i < array.length; i++) {
let target = i;
for (let j = i - 1; j >= 0; j--) {
if (array[target] < array[j]) {
[array[target], array[j]] = [array[j], array[target]]
target = j;
} else {
break;
}
}
}
return array;
}
复杂度
时间复杂度:O(n2)
空间复杂度:O(1)
稳定性
稳定
二、交换排序
(1)冒泡排序
循环数组,比较当前元素和上一个元素,如果当前元素比上一个元素小,向下冒泡。
这样一次循环之后最前一个数就是本数组最小的数。
下一次循环继续上面的操作,不循环已经排序好的数。
优化:当一次循环没有发生冒泡,说明已经排序完成,停止循环。
function bubbleSort(array) {
//第一个循环是所需次数
for (let j = 0; j < array.length; j++) {
let complete = true;
for (let i = array.length-1; i>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(n2)
空间复杂度:O(1)
稳定性
稳定
(2)快速排序
快速排序:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使整个数据变成有序序列。