首先 js 数组原生支持的排序方法
arr.sort((a,b) => a-b) // 从小到大
有三种基础的排序算法:冒泡排序,选择排序,插入排序,它们比较好理解,但是时间复杂度较差,
冒泡排序
思路分析:
相邻两个元素比较,大的放后面,每轮冒泡都会确定一个元素(从后往前,从大往小)
// 平均时间复杂度 O(n²)
function bubbleSort(arr){
const len = arr.length
// 一轮冒泡只能确定一个元素位置,
for(let i=0; i<len; i++){ // 有多少元素,冒泡多少轮
// 第 i 轮数组末尾 i 个元素已经有序了,不用参与冒泡了
for(let j=0; j< len-1-i; j++){
if(arr[j] > arr[j+1]){
// 数组解构交换两项
[arr[j], arr[j+1]] = [arr[j+1], arr[j]]
}
}
}
return arr
}
选择排序
思路分析:
冒泡排序是先确定大的值,从后往前排
选择排序是先确定小的值,从前往后排,通过交换小值的位置和对应头部位置使最小值排在头部
举例:arr = [5,4,3,2,1],arr[0] 应该存放最小的值,找到最小值是 arr[4],交换索引 0 和 4的值得到arr = [1,4,3,2,5],这样就确定了arr[0]应该存放的值
// 平均时间复杂度 O(n²)
function selectSort(arr){
const len = arr.length
let minIndex
for(let i=0; i<len-1; i++){ // 每轮循环确定一个最小值
minIndex = i // 最小值假设最前面
for(let j=i+1; j<len; j++){ // 从后面找到实际最小值的 index
if(arr[j] < arr[minIndex]){
minIndex = j
}
}
if(minIndex !== i){ // 找到最小值进行交换放前面
[arr[i],arr[minIndex]] = [arr[minIndex], arr[i]]
}
}
return arr
}
插入排序
思路分析:
插入排序的思想类似往排好大小的一把牌里插入新牌
一个元素默认前面都是从小到大排好的,把这个元素与前一个元素比较,比前一个元素小则继续往前比较,直到它比前一个元素大,比后一个元素小,这就是元素该插入的位置
// 平均时间复杂度 O(n²)
function insertSort(arr){
let len = arr.length
for(let i=1; i<len; i++){ // arr[0] 初始有序数组
let temp = arr[i]
let j = i // j 指针决定temp的插入位置
while(j>0 && arr[j-1] > temp){
arr[j] = arr[j-1] // 空出index j-1 的位置
j--
}
arr[j] = temp
}
return arr
}
