首先 js 数组原生支持的排序方法

  1. 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
}