基础算法JS-01

114 阅读1分钟

let arr = [3, 15, 36, 25, 27, 4, 50, 49]

1. 冒泡排序

// 冒泡排序 首先确认循环次数
for (let i = arr.length - 1; i > 0; i--) {
  for(let j=0;j<i;j++){
    let temp = arr[j]
    if(arr[j]>arr[j+1]){
      arr[j] = arr[j+1]
      arr[j+1] = temp
    }
  }
}

2. 快速排序

// 快排 递归 比较值为中位数
const quickSort = function (arr) {
  if (arr.length <= 1) return arr
  let pivotIndex = Math.floor(arr.length / 2)
  let pivotValue = arr.splice(pivotIndex, 1)[0]
  let left = (right = [])
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] > pivotValue) {
      right.push(arr[i])
    } else {
      left.push(arr[i])
    }
  }
  return quickSort(left).concat([pivotValue],quickSort(right))
}

3. 计数排序

// 哈希 数组组合计数排序
function countSort(arr){
    let hashTable = {}
    let resArr = []
    // 记录数据和数据对应的次数
    for(let i = 0; i < arr.length-1; i++){
        if(!(arr[i] in hashTable)){
            hashTable[arr[i]] = 1
        } else {
            hashTable[arr[i]] += 1
        }
    }
    // 按顺序添加到res中
    let index = 0
    for (let j = min; j <= max; j++){
        while(hashTable[j] > 0){
            resArr[index++] = j
            hashTable[j]--
        }
    }
    return resArr
}

4. 插入算法

// 插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序
function insetSort (arr) {
  for (let i = 1; i < arr.length; i++) {
    j = i
    temp = arr[i]
    while (j > 0 && arr[j - 1] > temp) {
      arr[j] = arr[j - 1]
      j--
    }
    arr[j] = temp
  }
  return arr
}

5. 选择排序

function selSort(arr){
    for(let i = 0; i < arr.length; i++){
        let minIndex = i
        // 筛选出最小值
        for(let j = i; j < arr.length; j++){
            if(arr[j] < arr[minIndex]){
                minIndex = j
            }
        }
        // 交换位置
        let temp = arr[minIndex]
        arr[minIndex] = arr[i]
        arr[i] = temp
    }
    return arr
}

6. 二分查找

function binSearch(arr,value){
    let left = 0
    let right = arr.length-1
    while(left<right){
        let mid = Math.floor((left+right)/2)
        if(value==arr[mid]){
            return mid
        } else if(value>arr[mid]){
            left = mid +1
        } else {
            right = mid -1
        }
    }
    return
}