7.分治算法

116 阅读1分钟

1.分治思想

将一个大问题递归分解为每个小问题,直到不能再分解,逐一求解最后再合并,具体实现分为三个过程:分解=>求解=>合并

2.实现代码

排序算法中的归并排序快速排序就使用到了分治的思想

// 归并排序:先分后排
function mergeSort(arr){
  let len = arr.length
  if(len===1) return arr // 基准
  
  let mid = Math.floor(len/2)
  let left = arr.splice(0,mid)
  let right = arr.splice(mid)
  
  return arr = merge(mergeSort(left),mergeSort(right)) // 入执行栈
}

function merge(left,right){
  let l = 0
  let lMax = l.length-1
  let r = 0 
  let rMax = r.length-1
  let res = []
  
  while(l<=lMax && r<=rMax){
    if(left[l]<right[r]) res.push(left[l++])
    else res.push(right[r++])
  }
  
  while(l<=lMax) res.push(left[l++])
  while(r<=rMax) res.push(right[r++])
  
  return res
}

// 快速排序:先排后分
function quickSort(arr){
  let len = arr.length
  if(len===1) return arr // 基准
  
  let mid = arr.splice(Math.floor(len/2),1)[0]
  let left = []
  let right = []
  arr.forEach(item=>{
    if(item<=mid) left.push(item)
    else right.push(item)
  })
  return arr = [...quickSort(left), mid, ...quickSort(right)]
}