@@ -159,4 +159,47 @@ mergeSort(data, 0, 6) // mid = 3
159
159
160
160
161
161
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),并且相比归并排序来说,所需的常数时间也更少。
0 commit comments