前端基礎(chǔ)整理 | 算法基礎(chǔ)

排序算法

冒泡排序

const bubbleSort = arr => {
  for (let i = 0; i < arr.length - 1; i++) {
    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
      }
    }
  }
}

選擇排序

const selectionSort = arr => {
  for (let i = arr.length - 1; i > 0; i--) {
    let max = i
    for (let j = 0; j <= i; j++) {
      if (arr[j] > arr[max]) max = j
    }
    let temp = arr[i]
    arr[i] = arr[max]
    arr[max] = temp
  }
}

插入排序

const insertionSort = arr => {
  for (let i = 1; i < arr.length; i++) {
    let temp = arr[i]
    for (var j = i - 1; j >= 0 && arr[j] > temp; j--) {
      arr[j + 1] = arr[j]
    }
    arr[j + 1] = temp
  }
}

希爾排序

const shellSort = arr => {
  for (let gap = arr.length >> 1; gap > 0; gap >>= 1) {
    for (let i = gap; i < arr.length; i++) {
      let temp = arr[i]
      for (var j = i - gap; j >= 0 && arr[j] > temp; j -= gap) {
        arr[j + gap] = arr[j]
      }
      arr[j + gap] = temp
    }
  }
}

歸并排序

const mergeSort = arr => {
  if (arr.length <= 1) return arr
  let mid = arr.length >> 1
  let left = arr.slice(0, mid)
  let right = arr.slice(mid)
  return merge(mergeSort(left), mergeSort(right))
}

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

堆排序

const heapSort = arr => {
    const swap = (i,j) => {
        let temp = arr[i]
        arr[i] = arr[j]
        arr[j] = temp
    }
    const maxHeapify = (start,end) => {
        let dad = start
        let son = dad*2+1
        if(son >= end) return 
        if(son+1<end && arr[son]<arr[son+1]) son++
        if(arr[dad] <= arr[son]) {
            swap(dad,son)
            maxHeapify(son,end)
        }
    }
    let len = arr.length
    for(let i=(len>>1)-1;i>=0;i--) maxHeapify(i,len)// bottom parent node
    for (let i =len-1;i>0;i--) {
        swap(0, i); 
        maxHeapify(0, i);
    }
    return arr
}

快速排序

const quickSort = arr => {
  const len = arr.length
  if (len < 2) return arr
  const pivot = arr[0],
    left = [],
    right = []
  for (let i = 1; i < len; i++) {
    const item = arr[i]
    item >= pivot && right.push(item)
    item < pivot && left.push(item)
  }
  return quickSort(left).concat(pivot, quickSort(right))
}

查找算法

二分查找

  1. 基本形態(tài)
    一般來說,mid的溢出在js里還是挺難碰到的。如果有需要的場合的話,換成mid = low + Math.floor((high-low)/2)
function binarySearch (target, arr) {
  let low = 0, high = arr.length - 1, mid
  while (low <= high) {
    mid = Math.floor((high+low)/2)
    if (arr[mid] === target) {
      return mid
    } else if (arr[mid] < target) {
      low = mid + 1
    } else {
      high  = mid - 1
    }
  }
  return false
}
  1. 查找目標值區(qū)域左邊界
function binarySearch (target, arr) {
  let low = 0, high = arr.length - 1, mid
  while (low <= high) {
    mid = Math.floor((high+low)/2)
    if (arr[mid] >= target) {
      high = mid - 1
    } else {
      low = mid + 1
    }
  }
  if(low < A.length && A[low] == target)
    return low;
  else
    return false;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,298評論 0 52
  • 面試中常用的幾個基本算法整理記錄(二) 無意中看到了面試中的 10 大排序算法總結(jié)原文地址記錄一下,方便查找。 查...
    190CM閱讀 1,876評論 1 12
  • 大寫的轉(zhuǎn) 目錄 [冒泡排序][雞尾酒排序] [選擇排序] [插入排序][二分插入排序][希爾排序] [歸并排序] ...
    Solang閱讀 1,866評論 0 16
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    閑云清煙閱讀 819評論 0 6
  • 一、 單項選擇題(共71題) 對n個元素的序列進行冒泡排序時,最少的比較次數(shù)是( )。A. n ...
    貝影閱讀 9,420評論 0 10

友情鏈接更多精彩內(nèi)容