常见的排序算法实现

56 阅读1分钟

冒泡排序

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

  return arr
}

选择排序

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

插入排序

function insertion_sort(arr){
  let length = arr.length
  for(let i = 1; i < length; i++){
    for(let pre = i-1; pre >= 0; pre--){
      if(arr[pre] > arr[pre + 1]){
        [arr[pre], arr[pre+1]] = [arr[pre + 1], arr[pre]]
        continue
      }
      break
    }
  }
  return arr
}

快速排序

function quick_sort(arr){
  if (arr.length <= 1) return arr
  let left = [], right = []

  let index = Math.floor(Math.random() * arr.length)

  for( let item of arr){
    if (item < arr[index]){
      left.push(item)
    }else{
      right.push(item)
    }
  }
  return [...quick_sort(left), ...quick_sort(right)]
}

归并排序

function merge_sort(arr){
  if( arr.length < 2) return arr
  let middle = Math.floor( arr.length / 2),
  left = arr.slice(0, middle),
  right = arr.slice(middle)
  return merge( merge_sort( left), merge_sort(right))
}

function merge(left, right){
  let res = []
  while(left.length && right.length){
    if( left[0] < right[0]){
      res.push(left.shift())
    }else{
      res.push(right.shift())
    }
  }
  if(left.length){
    return res.concat(left)
  }else{
    return res.concat(right)
  }
}