JavaScript 实现快排如下:
function quickSort(arr) { if(arr.length<=1) {return arr}; var pivotIndex = Math.floor(arr.length/2); var pivot = arr.splice(pivotIndex, 1)[0]; var left = []; var right = []; for(var i=0;i<arr.length;i++) { if(arr[i]<pivot) { left.push(arr[i]) } else{ right.push(arr[i]) } }; return quickSort(left).concat([pivot],quickSort(right)); }
有几点需要注意:
1.若定义变量 var len = arr.length ,并用len代替所有arr.length,会变成死循环。
原因 splice 会改变原数组长度,在一开始定义的len 与经过splice之后的 arr.length 长度是不相等的。(在本案例中会相差1,因为从arr中抽出了一位。)
2.二分法里找中间点pivot
直接 var pivot = arr[pivotIndex] 得到的 piovt 值似乎与 var pivot = arr.splice(pivotIndex, 1)[0] 完全一样,但在上面写法里不能相互替换,否则会出现死循环。
原因还是 splice 会改变原数组长度,上面快排方法是基于splice改变了数组长度来实现的。
参考链接:http://www.ruanyifeng.com/blog/2011/04/quicksort_in_javascript.html