快速排序法
1 从数列中挑出一个元素,称为 “基准”(pivot)
2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
function quickSort(arr){
if (!(arr instanceof Array)) return [];
// console.log('arr',arr);
let length = arr.length;
// 当数组存在元素并且多于一个元素时执行
if (length > 1) {
let pivotIndex = Math.floor(length/2);
let pivot = arr.splice(pivotIndex,1)[0];
let left = [];
let right = [];
// 然后开始遍历数组,将小于基准的元素放入左边,大于基准的放入右边
for(let i = 0;i < length; i++){
// console.log(arr,'arr[i]',arr[i],pivot);
if(arr[i] !== undefined){
if (arr[i] < pivot) {
left.push(arr[i]);
} else{
right.push(arr[i]);
}
}
}
// 用递归不断重复这个过程
return quickSort(left).concat([pivot],quickSort(right));
}else{
return arr;
}
}
console.log('last',quickSort([5,12,55,9,33,4,7]));//4,5,7,9,12,33,55