快速排序

转载自阮一峰老师的 《快速排序(Quicksort)的 Javascript 实现》

算法思路

“快速排序”的思想很简单,整个排序过程只需要三步:

  1. 在数据集之中,选择一个元素作为 “基准”(pivot)。
  2. 所有小于 “基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到 “基准”的右边。
  3. 对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

举例来说,现在有一个数据集{85, 24, 63, 45, 17, 31, 96, 50},怎么对其排序呢?

第一步,选择中间的元素 45 作为”基准”。(基准值可以任意选择,但是选择中间的值比较容易理解。)

第二步,按照顺序,将每个元素与”基准”进行比较,形成两个子集,一个”小于 45”,另一个”大于等于 45”。

第三步,对两个子集不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

实现

检查数组的元素个数,如果小于等于 1,就返回

1
2
3
var quickSort = function(arr) {
if(arr.length <= 1) return arr;
}

接着,选择”基准”(pivot),并将其与原数组分离,再定义两个空数组,用来存放一左一右的两个子集。

1
2
3
4
5
6
7
8
var quickSort = function(arr) {
if(arr.length <= 1) return arr;

+ const centerIndex = Math.floor(arr.length / 2);
+ const center = arr.splice(centerIndex, 1)[0];
+ const left = [];
+ const right = [];
}

然后,开始遍历数组,小于”基准”的元素放入左边的子集,大于基准的元素放入右边的子集。

1
2
3
4
5
6
7
8
9
10
11
12
var quickSort = function(arr) {
if(arr.length <= 1) return arr;

const centerIndex = Math.floor(arr.length / 2);
const center = arr.splice(centerIndex, 1)[0];
const left = [];
const right = [];
+ for(let i = 0; i < arr.length; i++) {
+ arr[i] < center ? left.push(arr[i]) : right.push(arr[i]);
+ }

};

最后,使用递归不断重复这个过程,就可以得到排序后的数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
var quickSort = function(arr) {
if(arr.length <= 1) return arr;

const centerIndex = Math.floor(arr.length / 2);
const center = arr.splice(centerIndex, 1)[0];
const left = [];
const right = [];
for(let i = 0; i < arr.length; i++) {
arr[i] < center ? left.push(arr[i]) : right.push(arr[i]);
}

+ return [...quickSort(left), center, ...quickSort(right)];
};

最终代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var quickSort = function(arr) {
if(arr.length <= 1) return arr;

const centerIndex = Math.floor(arr.length / 2);
const center = arr.splice(centerIndex, 1)[0];
const left = [];
const right = [];
for(let i = 0; i < arr.length; i++) {
arr[i] < center ? left.push(arr[i]) : right.push(arr[i]);
}

return [...quickSort(left), center, ...quickSort(right)];
};

var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(quickSort(arr));