Hugo-seth / blog

blog
https://hugo-seth.github.io/blog/
32 stars 1 forks source link

《算法导论》读书笔记-几种常见的排序算法 #8

Closed Hugo-seth closed 4 years ago

Hugo-seth commented 7 years ago

《算法导论》前四章介绍了几种简单的排序算法,这里用 js 整理成代码。由于高数没学好,所以关于复杂度的分析实在是看不太懂 😓

首先说明:排序的数据结构都是 js 的数组,index 是从 0 开始到 length - 1

function insertSort(arr) {
    for (let i = 1; i < arr.length; i++) {
       let j = i - 1;
       while (j >= 0 && arr[j + 1] < arr[j]) {
          [arr[j + 1], arr[j]] = [arr[j], arr[j + 1]];
          j--;
       }
    }
    return arr;
}
function bubbleSort(arr) {
    let length = arr.length;
    for (let i = 0; i < length; i++) {
       for (let j = i; j < length - 1 - i; j++) {
          if (arr[j] > arr[j + 1]) {
             [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
          }
       }
    }
    return arr;
}
function selectSort(arr) {
    let length = arr.length;
    let currentMin, currentMinIndex;
    for (let i = 0; i < length - 1; i++) {
       currentMin = arr[i];
       currentMinIndex = i;
       for (let j = i; j < length; j++) {
          if (currentMin > arr[j]) {
             currentMin = arr[j];
             currentMinIndex = j;
          }
          if (j === length - 1 && currentMinIndex !== i) {
             [arr[i], arr[currentMinIndex]] = [arr[currentMinIndex], arr[i]]
          }
       }
    }
    return arr;
}
function mergeSort(arr) {
    let len = arr.length
    if (len < 2) {
      return arr
    }
    let middle = Math.floor(len / 2),
      left = arr.slice(0, middle),
      right = arr.slice(middle)

    return merge(mergeSort(left), mergeSort(right))
}

function merge(left, right) {
    let result = []

    while (left.length && right.length) {
      if (left[0] <= right[0]) {
        result.push(left.shift())
      } else {
        result.push(right.shift())
      }
    }

    while (left.length) {
      result.push(left.shift())
    }

    while(right.length) {
      result.push(right.shift())
    }

    return result
}