快速排序是什么 快速排序是图灵奖得主C. A. R. Hoare(1934--)于1960时提出来的。 javascript
引自wikipedia 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),一种排序算法,最先由东尼·霍尔提出。在平均情况下,排序n个项目要Ο(n log n)次比较。在最坏情况下则须要Ο(n2)次比较,但这种情况并不常见。事实上,快速排序一般明显比其余Ο(n log n)算法更快,由于它的内部循环(inner loop)能够在大部分的架构上颇有效率地被实现出来。html
function quickSort(arr) {
if (arr.length<=1) {return arr;}
var left = [],
right = [],
baseDot =Math.round(arr.length/2),
base =arr.splice(baseDot, 1)[0];
for (var i =0; i <arr.length; i++) {
if (arr[i] < base) {
left.push(arr[i])
}else {
right.push(arr[i])
}
}
return quickSort(left).concat([base], quickSort(right));
}
复制代码
实现一个quickSort的封装,而且定义left和right,找到数组的基准点baseDot和对应的基数base,而后遍历数组的每一项和base进行对比,最后递归调用,给出一个跳出条件if (arr.length <= 1) {return arr;}
java
function quickSort(array, left, right) {
var length =array.length;
left =typeof left ==='number'? left :0,
right =typeof right ==='number'? right : length-1;
if (left < right) {
var index = left -1;
for (var i = left; i <= right; i++) {
if (array[i] <= array[right]) {
index++;
var temp = array[index];
array[index] = array[i];
array[i] = temp;
}
}
quickSort(array, left, index -1);
quickSort(array, index +1, right);
}
return array;
}
复制代码
快速排序的基本思想就是分治法面试
引自wikipedia 在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范式。字面上的解释是“分而治之”,就是把一个复杂的问题分红两个或更多的相同或类似的子问题,直到最后子问题能够简单的直接求解,原问题的解即子问题的解的合并。算法
三路快速排序是快速排序的的一个优化版本, 将数组分红三段, 即小于基准元素、 等于 基准元素和大于基准元素, 这样能够比较高效的处理数组中存在相同元素的状况,其它特征与快速排序基本相同。数组
我这里简单归纳一下思路,有兴趣的同窗可到上面的连接上阅读:快速排序及优化(Java实现)bash
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
console.time("test0")
function qSort(arr) {
if(arr.length == 0) {
return [];
}
var left = [];
var right = [];
var pivot = arr[0];
for(var i = 1; i < arr.length; i++) { // 注意这里的起始值,由于有一个做为flag了
if(arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return [...qSort(left), pivot, ...qSort(right)];
}
console.log(qSort([9, 4, 10, 3, 1, 1, 0, 10, 8, 3, 9, 9, 4, 10, 10, 9, 9, 9, 1, 0]));
console.timeEnd("test0")
</script>
<script type="text/javascript">
console.time("test1")
function qSort3(arr) { //三路快排
if(arr.length == 0) {
return [];
}
var left = [];
var center = [];
var right = [];
var pivot = arr[0]; //偷懒,直接取第一个,实际取值状况 参考[快速排序算法的优化思路总结]
for(var i = 0; i < arr.length; i++) {
if(arr[i] < pivot) {
left.push(arr[i]);
} else if(arr[i] == pivot) {
center.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return [...qSort3(left), ...center, ...qSort3(right)];
}
console.log(qSort3([9, 4, 10, 3, 1, 1, 0, 10, 8, 3, 9, 9, 4, 10, 10, 9, 9, 9, 1, 0]))
console.timeEnd("test1")
</script>
</head>
<body>
</body>
</html>
复制代码
能够看到对有重复数据的数据优化仍是很可观的。。架构