插入排序(InsertionSort)
插入排序的算法思想
循环数组从第二个元素开始向前比较,如果符合条件(比前面的大或者小),则交换位置,最终“插入”到相应的位置。
插入排序动画
代码实现(JS)
const arr = [9, 7, 8, 2, 5, 1, 3, 6, 4]
function InsertionSort(arr) {
for (var i = 1; i < arr.length; i++) {
var j = i
while (j > 0) {
if (arr[j] < arr[j - 1]) {
[arr[j], arr[j - 1]] = [arr[j - 1], arr[j]]
} else
break
}
j--
}
}
}
InsertionSort(arr)
console.log(arr) //[1, 2, 3, 4, 5, 6, 7, 8, 9]
希尔排序(Shell Sort)
希尔排序又称缩小增量排序由DL.Shell于1959年提出,因此得名。是插入排序的一种,对插入排序做了优化。
希尔排序的算法思想
使用插入排序,通过比较相距一定间隔(增量)的元素,每次比较所用的距离随着算法的进行而缩小,直到比较到相邻元素为止。
希尔排序时间复杂度是 O(n^(1.3-2)),空间复杂度为常数阶 O(1)。希尔排序没有时间复杂度为 O(n(logn)) 的快速排序算法快 ,因此对中等大小规模表现良好,但对规模非常大的数据排序不是最优选择,总之比一般 O(n^2 ) 复杂度的算法快得多。
希尔排序图解
-
(1)初始增量第一趟 gap = length/2 = 4
-
(2)第二趟,增量缩小为 2
-
(3)第三趟,增量缩小为 1,得到最终排序结果
代码实现(JS)
const arr = [7, 6, 9, 3, 1, 5, 2, 4, 0]
function ShellSort(arr) {
var len = arr.length
for (var gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) {
for (var i = gap; i < len; i++) {
var j = i
var tmp = arr[j]
if(arr[j] < arr[j - gap]){
while (j - gap >=0 && tmp < arr[j - gap]) {
arr[j] = arr[j - gap]
j -= gap
}
arr[j] = tmp
}
}
}
}
ShellSort(arr)
console.log(arr) // [0, 1, 2, 3, 4, 5, 6, 7, 9]