常见的排序算法

90 阅读1分钟

冒泡排序

冒泡排序的实现思路是比较任何两个相邻的项, 如果前者比后者大, 则将它们互换位置.

先生成一个指定长度的随机数组

function generatarAry (num = 10) {
  let arr = []
  for (let i = 0; i < num; i++) {
    let item = ~~(Math.random() * (num + 1))
    arr.push(item)
  }
  return arr
}

冒泡算法性能较差,事件复杂度为O(n*2)

function bubbleSort (ary = []) {
  for (let i = 0; i < ary.length - 1; i++) {
    for (let j = 0; j < ary.length - 1 - i; j++) {
      if (ary[j] > ary[j + 1]) [ary[j], ary[j + 1]] = [ary[j + 1], ary[j]]
    }
  }
  return ary
}

快速排序

快速排序采用分治法思想,将数组进行划分。时间复杂度为O(nlog^n)

function quickSort (ary = []) {
  if (ary.length < 2) return
  let l = [], r = [], m = ~~(ary.length / 2) // 新建两个空数组,分别存放小于中间数和大于中间数的数据
  const mid = ary.splice(m, 1)[0]
  for (let i = 0; i < ary.length; i++) {
    ary[i] < mid ? l.push(ary[i]) : r.push(ary[i])
  }
  return quickSort(l).concat([mid], quickSort(r)) // 不断缩减区间,分别排序左右两个区间内的数据
}

选择排序

选择排序的思路是找到数据结构中的最小值并将其放置在第一位,接着找到第二个最小值并将其放到第二位,依次类推.

function selectSort (ary = []) {
  let minIdx = 0
  for (let i = 0; i < ary.length - 1; i++) {
    minIdx = i
    for (let j = i; j < ary.length; j++) { // 外层循环会找到最小值并替换到前面,所以内层循环从i开始即可
      if (ary[minIdx] > ary[j]) minIdx = j // 找到更小的值更新最小值下标
    }
    if (minIdx !== i) [ary[i], ary[minIdx]] = [ary[minIdx], ary[i]] // 替换
  }
  return ary
}

插入排序

插入排序 的思路是每次排一个数组项,假定第一项已经排序,接着它和第二项比较, 决定第二项的位置, 然后接着用同样的方式决定第三项的位置, 依次类推, 最终将整个数组从小到大依次排序.

function insertSort (ary = []) {
  let j, temp
  for (let i = 0; i < ary.length; i++) {
    j = i, temp = ary[i]
    while (j > 0 && ary[j - 1] > temp) {
      ary[j] = ary[j - 1]
      j--   // 缩减下标,比较相邻的数是否大于temp
    }
    ary[j] = temp // 放到相应的位置
  }
  return ary
}

结语

写的不好,各位大佬多多指教,感恩家人🙏