快速排序
思路核心: 分而治之,即分成若个部分,逐个解决
思路:
- 在数组中,选择一个数作为"基准"(pivot)。
- 将数组分成左右俩部分,小于
基准的放在左部分,大于基准的放在右部分。 - 对"基准"左部分和右部分,不断重复第一步和第二步,直到所有部分只剩下一个元素为止。
动画参考:
代码实现
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)