JavaScript实现排序算法之快速排序

182 阅读1分钟

快速排序

思路核心: 分而治之,即分成若个部分,逐个解决

思路:

  • 在数组中,选择一个数作为"基准"(pivot)。
  • 将数组分成左右俩部分,小于 基准 的放在左部分,大于 基准 的放在右部分
  • 对"基准"左部分和右部分,不断重复第一步和第二步,直到所有部分只剩下一个元素为止。

动画参考: quick.gif

代码实现

class ArrayList {
  array = [];

  // 用于插入数字
  insert(item) {
    this.array.push(item);
  }

  // 快速排序
  quickSort() {
    const quick = (array) => {
      if (array.length <= 1) {return array;}
      let pivotIndex = Math.floor(array.length / 2);
      let pivot = array.splice(pivotIndex, 1)[0];
      let left = [];
      let right = [];
      for (let i = 0; i < array.length; i++) {
        if (array[i] > pivot) {
          right.push(array[i]);
        } else {
          left.push(array[i]);
        }
      }
      return quick(left).concat([pivot], quick(right));
    };
    return this.array = quick(this.array);
  }

}

let list = new ArrayList();
list.insert(12);
list.insert(2);
list.insert(45);
list.insert(123);
list.insert(481);
list.insert(56);
console.log(list.array);

// 调用快速排序
list.quickSort();
console.log(list.array);

快速排序的效率

时间复杂度: O(nlogn)