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