-
快速排序是什么
- 快速排序的本质思想是二分法,先找出一个基准值,经过一个遍历后,把比基准值小的数据放在左面,大的放在右面,再将分好的左面和右面的依次进行这种操作。
-
时间复杂度
- 因为是二分法,所以时间复杂度是
O
l
o
g
n
Ologn
Ologn,代表数据增大n倍,耗时增加
O
l
o
g
n
Ologn
Ologn 倍。
- 大
O
O
O加上()的形式,里面包裹的是一个函数f(),
O
(
f
(
)
)
O(f())
O(f()) 代表某个算法的耗时或耗空间与n(数据量)增长之间的关系。比如数据n增大256倍,
l
o
g
log
log以2为底256的对数是8,所以耗时只需增加8倍。
-
实现
- 快速排序是面试经常问到的一种排序算法,我们来梳理下思路。
现在有个数组,首先找到一个基准值,可以将头部的当做基准值,也可以将尾部的当做基准值,我们取头部的当做基准值,定义一个temp 指向头部。然后声明两个指针,一个left 指向头部,一个right 指向尾。right 指针找比基准值小的,left 指针找比基准值小的,交换两个指针的数字,再继续移动两个指针直到他们两个相遇,再交换temp 和他们停下来指的位置。
const arr = [3, 6, 1, 2, 5, 4]
先移动right 指针,right 指向5,比3大,接着移动,指向2,比3小,停止。再移动left 指针,指向6,比3大,停止。 接着交换两个指针所指向的值。 right 接着向左移动,指向1,比3小,停止。left 向右移动,指向1,这时left 和right 相遇了,证明整个数组都被遍历了一遍,此时把temp 和left right 指向的数字交换。
到此时,第一轮的遍历结束,将数组分成了两部分,3左边的数字都是比3小的,右边都是比3大的。再次重复刚才的步骤,接着对左侧和右侧两个数组排序,不断的二分下去。
right 和left 相遇,和temp 指向同一个,左侧排序结束。接着右侧。
right 指向的4比temp 指向的6小,停止。移动left ,指向5,比6小,继续移动,指向4,和right 相遇。交换两个值。
排序结束。
过程就是这样,接下来代码实现下。
function quickSort(arr, begin, end) {
if (begin >= end) {
return
}
let temp = arr[begin];
let left = begin;
let right = end;
while(right > left) {
while(right > left && arr[right] >= temp) {
right--;
}
while(right > left && arr[left] <= temp) {
left++;
}
[arr[left], arr[right]] = [arr[right], arr[left]];
}
[arr[begin], arr[right]] = [arr[right], arr[begin]];
quickSort(arr, begin, right - 1);
quickSort(arr, right + 1, end);
return arr;
}
const arr = [3, 6, 1, 2, 5, 4];
const result = quickSort(arr, 0, arr.length - 1);
console.log(result);
|