对于 5743 经典快排过程:
5473
5437
会造成多次替换,所以写出优化算法:
去第一位为基准值
从左向右扫 发现大值
从右向左扫 发现小值 替换
将基准值和最后一个小值替换
function quick(arr, start, end) {
if (start >= end-1) {
return;
}
var mini = start;
var maxi = end;
var split = arr[start];
while (mini < maxi) {
var minv = arr[mini];
if (minv > split) {
var find=false;
while (mini < maxi) {
maxi--;
var maxv = arr[maxi];
if (maxv <= split) {
find=true;
arr[mini] = maxv;
arr[maxi] = minv;
break;
}
}
if(!find){
break;
}
}
mini++;
}
arr[start]=arr[mini-1];
arr[mini-1]=split;
console.log(arr.slice(start,end));
quick(arr, start, mini - 1);
quick(arr, mini, end);
return arr;
}
P.S. 算法好想 边界问题消耗了n长时间 特别是find
原文:http://my.oschina.net/u/132038/blog/505994