Quicksort(快速排序)
是由 东尼·霍尔 所发展的一种排序。
它比其他的Ο(n log n)算法更快,
因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。当然,本文是JavaScript实现。
算法
排序算法使用分治法 (Divide and conquer) 把一个序列(list)分为两个子序列(sub-lists)。
步骤
- 从数列中挑出一个元素,称为“基准” (pivot)。
- 重新排序数列,所有元素都比基准值晓得摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次迭代(iteration)中,它至少会把一个元素摆放到它最后的位置去。
代码
配合实现交换的swap的代码
function swap(items,firstIndex,secondIndex){
var temp = items[firstIndex];
items[firstIndex] = items[secondIndex];
items[secondIndex] = temp;
}
分区(partition)操作
function partition(items,left,right){
var pivot = items[Math.floor((right+left) / 2)],
i = left,
j = right;
while (i < j) {
while(items[i] < pivot) {
i++;
}
while (items[j] > pivot) {
j--;
}
if (i <= j) {
swap(items,i,j);
i++;
j--;
}
}
return i;
}
快排(使用递归)
function quickSort(items,left,right) {
var index;
if (items.length > 1) {
index = partition(items, left, right);
if (left <index - 1) {
quickSort(items, left, index - 1);
}
if (index < right) {
quickSort(items, index, right);
}
}
return items;
}
小结一下
使用了快排,改变了原数组。如果你使用了上方的代码,要记得这点啊。。
解决的办法?
复制原数组?
是是是是(