|
| 1 | +# 快速排序 |
| 2 | + |
| 3 | +快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。 |
| 4 | + |
| 5 | +快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高! 它是处理大数据最快的排序算法之一了。虽然 Worst Case 的时间复杂度达到了 O(n2),但是人家就是优秀,在大多数情况下都比平均时间复杂度为 O(n logn) 的排序算法表现要更好,可是这是为什么呢,我也不知道。好在我的强迫症又犯了,查了N多资料终于在《算法艺术与信息学竞赛》上找到了满意的答案: |
| 6 | + |
| 7 | +> 快速排序的最坏运行情况是O(n2),比如说顺序数列的快排。但它的平摊期望时间是O(n log n) ,且O(n log n)记号中隐含的常数因子很小,比复杂度稳定等于O(n log n)的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。 |
| 8 | + |
| 9 | + |
| 10 | +## 1. 动图演示 |
| 11 | + |
| 12 | + |
| 13 | + |
| 14 | + |
| 15 | +## 2. JavaScript 代码实现 |
| 16 | + |
| 17 | +```js |
| 18 | +function quickSort(arr, left, right) { |
| 19 | + var len = arr.length, |
| 20 | + partitionIndex, |
| 21 | + left = typeof left != 'number' ? 0 : left, |
| 22 | + right = typeof right != 'number' ? len - 1 : right; |
| 23 | + |
| 24 | + if (left < right) { |
| 25 | + partitionIndex = partition(arr, left, right); |
| 26 | + quickSort(arr, left, partitionIndex-1); |
| 27 | + quickSort(arr, partitionIndex+1, right); |
| 28 | + } |
| 29 | + return arr; |
| 30 | +} |
| 31 | + |
| 32 | +function partition(arr, left ,right) { // 分区操作 |
| 33 | + var pivot = left, // 设定基准值(pivot) |
| 34 | + index = pivot + 1; |
| 35 | + for (var i = index; i <= right; i++) { |
| 36 | + if (arr[i] < arr[pivot]) { |
| 37 | + swap(arr, i, index); |
| 38 | + index++; |
| 39 | + } |
| 40 | + } |
| 41 | + swap(arr, pivot, index - 1); |
| 42 | + return index-1; |
| 43 | +} |
| 44 | + |
| 45 | +function swap(arr, i, j) { |
| 46 | + var temp = arr[i]; |
| 47 | + arr[i] = arr[j]; |
| 48 | + arr[j] = temp; |
| 49 | +} |
| 50 | +``` |
0 commit comments