前端基础整理 | 算法基础

排序算法

冒泡排序

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. 基本形态
    一般来说,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. 查找目标值区域左边界
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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,287评论 0 52
  • 面试中常用的几个基本算法整理记录(二) 无意中看到了面试中的 10 大排序算法总结原文地址记录一下,方便查找。 查...
    190CM阅读 1,861评论 1 12
  • 大写的转 目录 [冒泡排序][鸡尾酒排序] [选择排序] [插入排序][二分插入排序][希尔排序] [归并排序] ...
    Solang阅读 1,849评论 0 16
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    闲云清烟阅读 810评论 0 6
  • 一、 单项选择题(共71题) 对n个元素的序列进行冒泡排序时,最少的比较次数是( )。A. n ...
    貝影阅读 9,400评论 0 10

友情链接更多精彩内容