冒泡算法 插入算法 快速算法

195 阅读1分钟

三大排序算法

冒泡算法

  • 循环数组,当前项与后一项进行比较,大于就交换
  • 每一次循环,最后一项一定是最大的

冒泡算法.jpg

let arr = [3, 2, 1, 2, 3]
function bubbling(arr) { 
   //外层循环次数:循环数组长度-1
  for (let i = 0; i < arr.length-1; i++) {
      //内层循环次数:循环数组长度-外层循环次数-1
    for (let j = 0; j < arr.length - i-1; j++) {
        //如果当前项大于后一项,使用临时变量法,交换两个数
      if (arr[j] > arr[j + 1]) { 
        let temp = arr[j]
        arr[j] = arr[j + 1]
        arr[j + 1] = temp
      }
    }
  }
  //返回新数组,以支持链式调用
  return arr
}
console.log(bubbling(arr))//输出:[ 1, 2, 2, 3, 3 ]

插入算法排序

  • 取出第一项,存入一个新数组
  • 循环除第一项外其他项,其他项大于新数组中的任意项,则存入任意项的末尾
  • 其他项不大于新数组中的每一项则存入开头
let arr = [3, 2, 1, 2, 3]
function insert(arr) {
  //取出第一项,存入新数组
  let newArr = [arr[0]]
  //外层循环:循环除第一项外每一项
  for (let i = 1; i < arr.length; i++) {
    //内层循环:循环新数组中每一项
    for (let j = newArr.length - 1; j >= 0; j--) {
      //大于新数组中任意项,则插入任意项末尾
      if (arr[i] > newArr[j]) {
        newArr.splice(j + 1, 0, arr[i])
        break
      }
      //如果索引为0,那么一定是最小的,插入开头
      if (j === 0) { 
        newArr.unshift(arr[i])
      }
    }
  }
  return newArr
}
console.log(insert(arr))//输出:[ 1, 2, 2, 3, 3 ]

快速算法排序

  • 使用递归
  • 找到数组中间项并在原数组中移除
  • 准备左右两个数组
  • 循环原数组,比中间项大的放右边,反之左边
function rapid(arr) { 
  //结束条件
  if(arr.length<=1)return arr
  //找到数组中间项并在原数组中移除
  let middleValue = arr.splice(Math.floor(arr.length / 2), 1)[0]
  //准备左右两个数组
  let L = []
  let R = []
  //循环原数组,比中间项大的放右边,反之左边
  for (let i = 0; i < arr.length; i++) { 
    arr[i]>middleValue?R.push(arr[i]):L.push(arr[i])
  }
  return rapid(L).concat(middleValue,rapid(R))
}
let arr = [3, 2, 1, 2, 3]
console.log(rapid(arr))//输出:[ 1, 2, 2, 3, 3 ]