前端排序算法和搜索算法(面试)

199 阅读1分钟

前端排序算法和搜索算法手写

可查看各种排序动画:visualgo.net/zh

前端面试常见排序算法

示例数组: let arr = [9, 7, 6, 4, 7, 3, 4, 8, 12, 43, 76, 32]

冒泡排序

//O(n*2)
function bubbling(arr) {
  var len = arr.length
  for (var i = 0; i < len; i++) {
    for (var j = 0; j < len - 1 - i; j++) {
      if (arr[j] > arr[j + 1]) {
        //相邻元素两两对比
        ;[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]] //通过解构完成元素交换
      }
    }
  }
  return arr
}

选择排序

//O(n*2)
function choice(arr) {
  var len = arr.length;
  for (let i = 0; i < len; i++) {
    let flag = i
    let min = arr[i]
    for (let j = i + 1; j < len; j++) {
      if (min > arr[j]) {
        min = arr[j]
        flag = j
      }
    }
    [arr[i], arr[flag]] = [arr[flag], arr[i]]
  }
  return arr
}

插入排序


//O(n*2)
function insert(arr) {
  var len = arr.length;
  for (let i = 1; i < len; i++) {
    let j = i
    while (j >= 1) {
      if (arr[j] < arr[j - 1]) {
        [arr[j - 1], arr[j]] = [arr[j], arr[j - 1]]
      }
      j--
    }
  }
  return arr
}
 

快速排序

//O(nlogn)
function quick(arr) {
  if (arr.length < 2) {
    return arr
  }
  let pivot = arr[0]
  let left = []
  let right = []
  for (let i = 1; i < arr.length; i++) {
    if (arr[i] <= pivot) {
      left.push(arr[i])
    } else if (arr[i] > pivot) {
      right.push(arr[i])
    }
  }
  left = quick(left)
  right = quick(right)

  return [...left, pivot, ...right]
}

console.log(quick(arr))

归并排序

//O(nlogn)
function merge(left, right) {
  let i = 0
  let j = 0
  let arr = []
  while (i < left.length && j < right.length) {
    if (left[i] < right[j]) {
      arr.push(left[i++])
    } else if (left[i] >= right[j]) {
      arr.push(right[j++])
    }
  }
  if (i === left.length) {
    arr.push(...right.slice(j))
  }
  if (j === right.length) {
    arr.push(...left.slice(i))
  }

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

搜索算法

顺序搜索


//O(n)
function sequenal(arr,n){
  for(let i = 0;i<arr.length;i++){
    if(n == arr[i]){
      return i
    }
  }
  return -1
}

二分搜索


//O(logn)
function binary(arr,n){
  arr.sort((a,b)=> a-b)
  let low = 0
  let high = arr.length-1
  while(low<=high){
    const mid = Math.floor((low+high)/2)
    const element = arr[mid]
    if(element < n){
      low = mid+1
    }else if(element > n){
      high = mid-1
    }else{
      return mid
    }
  }
  return -1
}