快速排序主要分三部分:1、选出一个基准(pivot) 2、所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;3、递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去
function quickSort(arr, left, right) {
var len = arr.length,
partitionIndex,
left = typeof left != 'number' ? 0 : left,
right = typeof right != 'number' ? len - 1 : right;
if (left < right) {
partitionIndex = partition(arr, left, right);
quickSort(arr, left, partitionIndex-1);
quickSort(arr, partitionIndex+1, right);
}
return arr;
}
function partition(arr, left ,right) { // 分区操作
var pivot = left, // 设定基准值(pivot)
index = pivot + 1;
for (var i = index; i <= right; i++) {
if (arr[i] < arr[pivot]) {
swap(arr, i, index); // 调换顺序,小于基准值的值
index++;// 此处index 代表最开始大于基准值的索引。(或者理解为有index-1个小于基准值的个数)
}
}
swap(arr, pivot, index - 1); //这一步也就可以说是 将左、右两部分分开了。
return index-1;
}
function swap(arr, i, j) {
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
第二种方法:
function quickSort(arr) {
if (arr.length <= 1) { return arr } console.log("原数组是:" + arr)
var pivotIndex = Math.floor(arr.length / 2)
var pivot = arr.splice(pivotIndex, 1)[0]
var left = []
var right = []
console.log("将中介提取出来后数组是:" + arr)
for (var i = 0 ; i < arr.length ; i++){
console.log("此刻中介是:" + pivot + "当前元素是:" + arr[i])
if (arr[i] < pivot) {
left.push(arr[i]) console.log("移动" + arr[i] + "到左边")
} else {
right.push(arr[i]) console.log("移动" + arr[i] + "到右边")
}
}
return quickSort(left).concat([pivot], quickSort(right)) }
var nums = [2,3,4,3,1,5,7,122,341,-1]
console.log(quickSort(nums))