面試總結 - 基礎編程 - 排序算法5.js

冒泡排序

冒泡排序就是從數列的第0個數開始對比,若a[i] > a[i+1], 則調換i和i+1的順序,比較n-1次。最後形成了小的數在前,大的數在後。

  • 時間複雜度爲 O(n²)
function bubbleSort(arr) {
  for (let len = 0; len < arr.length - 1; len++) {
    for (let i = len; i > 0; i--) {
      if (arr[i] > arr[i + 1]) {
        [arr[i], arr[i + 1]] = [arr[i + 1], arr[i]]
      }
    }
  }
  // arr = arr.sort(function (x, y) { return x - y})
  return arr
}

// test
let arr = [8, 1, 2, 10, 3, 7, 9, 4, 5, 6];
let sortArr = bubbleSort(arr)
console.log(sortArr, '<=== bubbleSort')

快速排序

快速排序就是從目標數組中取一個標識值出來,將數組中的每一項都與這個值做比較,大的放一邊,小的放一邊;再將左邊和右邊的子數組分別再取一個標識出來做比較,以此類推遞歸,直到子數組長度爲1.

Array.prototype.quickSort = function (fn) {
  const isFn = (f) => {
    if (f === undefined) return 0;
    else if (typeof f !== 'function') {
      throw new Error(`fn must be function, but got a ${typeof f}`);
    }
    const compare = f(3, 1);
    return isNaN(compare) ? 0 : (compare > 0 ? 1 : -1);
  };
  const small2big = isFn(fn);

  const quick = (arr) => {
    if (arr.length <= 1) return arr;
    if (!small2big) return arr; // 0: 不排序 1: 升序 -1: 降序

    const mid = Math.floor(arr.length / 2);
    const reference = arr.splice(mid, 1)[0];
    const left = [], right = [];
    arr.forEach((item) => {
      if (small2big > 0) {
        if (item > reference) {
          right.push(item);
        } else {
          left.push(item);
        }
      } else {
        if (item < reference) {
          right.push(item);
        } else {
          left.push(item);
        }
      }
    });
    return quick(left).concat(reference, quick(right));
  };

  return quick(this);
}

const c = [1, 3, 6, 7, 8, 3, 4, 2, 5, 7, 8, 9, 6, 4, 3, 2];
const d = [1, 5, 3, 6, 7];
console.log(c.quickSort(function (a, b) { return b - a; }), '排序後 vs 排序前', c);
console.log(d.quickSort(), '排序後 vs 排序前', d);

翻譯題目:【士可殺不可辱!】
平常答:You can kill me, but you can not fuck me.
優秀答:A scholar prefers death to humiliation.
我答:Shi ke sha, bu ke ru.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章