![b844353044d04cf4955abe0607cf8cf0.png](https://img-blog.csdnimg.cn/img_convert/b844353044d04cf4955abe0607cf8cf0.png)
一 : 冒泡排序
人们开始学习排序算法时,通常都先学冒泡算法,因为它在所有排序算法中最简单。然而, 从运行时间的角度来看,冒泡排序是最差的一个,接下来你会知晓原因
冒泡排序比较所有相邻的两个项,如果第一个比第二个大,则交换它们。元素项向上移动至 正确的顺序,就好像气泡升至表面一样,冒泡排序因此得名。
export function bubbleSort(arr: number[]) {
for (let i = 0; i < arr.length - 1; i++) {
for (let j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
;[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
}
}
}
return arr
}
冒泡排序每一轮(外层循环) 会选出一个最小 或者最大的数组 放到数组最后
所以N 个 数字 只用 选N -1 次 =>外层循环 i<arr.length -1
内存循环 两两相比, 只用 比较 N - 1次 ,但是 外层循环已经找到的最值不用比较
所以 => 内层循环 j < arr.length - i -1
一幅图来描述 冒泡的工作流程
![0d2dd279d0af5a22b0d925aaf20dcf16.png](https://img-blog.csdnimg.cn/img_convert/0d2dd279d0af5a22b0d925aaf20dcf16.png)
二 :选择排序
选择排序算法是一种原址比较排序算法。 他解决了冒泡 交换次数过多的毛病,在冒泡排序中 需要交换 O(N^2) 次 但 选择排序中 只用交换 O(N)次
选择排序大致的思路是找到数据结构中的最小值并 将其放置在第一位,接着找到第二小的值并将其放在第二位,以此类推。
export function selectionSort(arr: number[]) {
let min = 0
for (let i = 0; i < arr.length - 1; i++) {
min = i
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
min = j
}
}
if (i !== min) {
;[arr[i], arr[min]] = [arr[min], arr[i]]
}
}
return arr
}
选择排序的代码执行过程 如下图
![c79568274574b683f264342bddc010e6.png](https://img-blog.csdnimg.cn/img_convert/c79568274574b683f264342bddc010e6.png)
三 :插入排序
插入排序的思想十分的重要, 学会了他你才能学习 希尔排序,而 希尔排序 又是排序算法 历史上的一个转折点 他打破了 排序算法 时间复杂度平均不会低于 O(N^2) 的理论。
插入排序每次排一个数组项,以此方式构建最后的排序数组。假定第一项已经排序了。接着, 它和第二项进行比较——第二项是应该待在原位还是插到第一项之前呢?这样,头两项就已正确 排序,接着和第三项比较(它是该插入到第一、第二还是第三的位置呢),以此类推
export function insertionSort(arr: number[]) {
for (let i = 1; i < arr.length; i++) {
let j = i
let temp = arr[i]
//插入操作
while (j > 0 && arr[j - 1] > temp) {
arr[j] = arr[j - 1]
j--
}
arr[j] = temp
}
return arr
}
插入排序的 过程 假设数组 [ 3 ,5 , 1, 4, 2]
一开始 把 3 当作 局部有序 , 把 5 拎出来 和 局部有序 数列比较 并插入
// 第一次 : 5 > 3 合理 进入下一次循环