Skip to content

Commit 6b4cb91

Browse files
committed
快排
1 parent 87146c4 commit 6b4cb91

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

Algorithm/algorithm-ch.md

+44-1
Original file line numberDiff line numberDiff line change
@@ -159,4 +159,47 @@ mergeSort(data, 0, 6) // mid = 3
159159

160160

161161

162-
该算法的操作次数是可以这样计算:递归了两次,每次数据量是数组的一半,并且最后把整个数组迭代了一次,所以得出表达式 `2T(N / 2) + T(N)` (T 代表时间,N 代表数据量)。根据该表达式可以套用 [该公式](https://www.wikiwand.com/zh-hans/%E4%B8%BB%E5%AE%9A%E7%90%86) 得出时间复杂度为 `O(N * logN)`
162+
该算法的操作次数是可以这样计算:递归了两次,每次数据量是数组的一半,并且最后把整个数组迭代了一次,所以得出表达式 `2T(N / 2) + T(N)` (T 代表时间,N 代表数据量)。根据该表达式可以套用 [该公式](https://www.wikiwand.com/zh-hans/%E4%B8%BB%E5%AE%9A%E7%90%86) 得出时间复杂度为 `O(N * logN)`
163+
164+
#### 快排
165+
166+
快排的原理如下。随机选取一个数组中的值作为基准值,从左至右取值与基准值对比大小。比基准值小的放数组左边,大的放右边,对比完成后将基准值和第一个比基准值大的值交换位置。然后将数组以基准值的位置分为两部分,继续递归以上操作。
167+
168+
<div align="center"><img src="https://user-gold-cdn.xitu.io/2018/4/16/162cd23e69ca9ea3?w=824&h=506&f=gif&s=867744" width=500 /></div>
169+
170+
以下是实现该算法的代码
171+
172+
```js
173+
function sort(array) {
174+
checkArray(array);
175+
quickSort(array, 0, array.length - 1);
176+
return array;
177+
}
178+
179+
function quickSort(array, left, right) {
180+
if (left < right) {
181+
swap(array, , right)
182+
// 随机取值,然后和末尾交换,这样做比固定取一个位置的复杂度略低
183+
let indexs = part(array, parseInt(Math.random() * (right - left + 1)) + left, right);
184+
quickSort(array, left, indexs[0]);
185+
quickSort(array, indexs[1] + 1, right);
186+
}
187+
}
188+
function part(array, left, right) {
189+
let less = left - 1;
190+
let more = right;
191+
while (left < more) {
192+
if (array[left] < array[right]) {
193+
swap(array, ++less, left++);
194+
} else if (array[left] > array[right]) {
195+
swap(array, --more, left);
196+
} else {
197+
left++;
198+
}
199+
}
200+
swap(array, right, more);
201+
return [less, more];
202+
}
203+
```
204+
205+
该算法的复杂度和归并排序是相同的,但是额外空间复杂度比归并排序少,只需 O(logN),并且相比归并排序来说,所需的常数时间也更少。

JS/JS-ch.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -693,7 +693,7 @@ define(function(require, exports, module) {
693693

694694
你是否在日常开发中遇到一个问题,在滚动事件中需要做个复杂计算或者实现一个按钮的防二次点击操作。
695695

696-
这些需求都可以通过函数防抖动来实现。尤其是第一个需求,如果在频繁的事件回调中做复杂计算,很有可能导致页面卡顿,不如将多次计算合并为一次计算,只在一个精确点做操作。因为防抖动的轮子很多,这里也不重新自己造个轮子了,直接使用 understore 的源码来解释防抖动。
696+
这些需求都可以通过函数防抖动来实现。尤其是第一个需求,如果在频繁的事件回调中做复杂计算,很有可能导致页面卡顿,不如将多次计算合并为一次计算,只在一个精确点做操作。因为防抖动的轮子很多,这里也不重新自己造个轮子了,直接使用 underscore 的源码来解释防抖动。
697697

698698
```js
699699
// 参数含义依次为回调函数

0 commit comments

Comments
 (0)