转载自阮一峰老师的 《快速排序(Quicksort)的 Javascript 实现》
算法思路
“快速排序”的思想很简单,整个排序过程只需要三步:
- 在数据集之中,选择一个元素作为 “基准”(pivot)。
- 所有小于 “基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到 “基准”的右边。
- 对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
举例来说,现在有一个数据集{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));
|