15. js 实现数组的快递排序

243 阅读1分钟

js 实现数组的快递排序

思路是固定的

  1. 随便取一个值 midValue 作为比较的对象,可以取数组中间的值, 也可以取第一个值
  2. 定义临时存放的数组,存放比较的值, 小于 midValue 的 放left 大于的放right
  3. 返回 递归调用 left 和 right 的链接值
  4. 如果不去重的化, 再定义个中间 变量midary , 相等的push 这个数组。返回的值 也链接上中间值

代码实现

  1. 去重
function quicksort (arr: number[]):number[] {
  const length = arr.length;
  if (length === 0) return arr
  let midIndex = Math.floor(length/2)
  let midValue = arr[midIndex] 
  let leftArr : number[] = []
  let rightArr:number[] = []

  for (let i=0; i< length;i++) {
    if (arr[i] < midValue) {
      leftArr.push(arr[i])
    }else if (arr[i] > midValue) {
      rightArr.push(arr[i])
    }
  }
  return quicksort(leftArr).concat(midValue,quicksort(rightArr))
}
  1. 不去重
function quicksort (arr: number[]):number[] {
  const length = arr.length;
  if (length === 0) return arr
  let midIndex = Math.floor(length/2)
  let midValue = arr[midIndex] 
  let leftArr : number[] = []
  let rightArr:number[] = []
  let midArr:number[] = []
  for (let i=0; i< length;i++) {
    if (arr[i] < midValue) {
      leftArr.push(arr[i])
    }else if (arr[i] > midValue) {
      rightArr.push(arr[i])
    }else if (arr[i] === midValue) {
      midArr.push(arr[i])
    }
  }
  return quicksort(leftArr).concat(midArr).concat(quicksort(rightArr))
}

复杂度分析

首先外面遍历的复杂度为O(n) 遍历的里面嵌套二分 复杂度为O(logn) 合在一起的复杂度为 O(nlogn)

取中间值

两个方式 一个是slice 一个是splice

在操作数组中 splice 的复杂度是比 slice 高的. 但是放到上面的快速排序中,因为有二分的影响,和本身算法的时间复杂度就比较高,的情况下,对时间复杂度影响不大