File tree Expand file tree Collapse file tree 4 files changed +34
-33
lines changed Expand file tree Collapse file tree 4 files changed +34
-33
lines changed Original file line number Diff line number Diff line change 224
224
225
225
< h1 id ="_1 "> 快速排序</ h1 >
226
226
< p > 快速排序名字可不是盖的,很多程序语言标准库实现的内置排序都有它的身影,我们就直奔主题吧。
227
- 和归并排序一样,快排也是一种分而治之的策略 。归并排序把数组递归成只有单个元素的数组,之后再不断两两
227
+ 和归并排序一样,快排也是一种分而治之(divide and conquer)的策略 。归并排序把数组递归成只有单个元素的数组,之后再不断两两
228
228
合并,最后得到一个有序数组。这里的递归基本条件就是只包含一个元素的数组,当数组只包含一个元素的时候,我们可以认为它本来就是有序的(当然空数组也不用排序)。</ p >
229
229
< p > 快排的工作过程其实比较简单,三步走:</ p >
230
230
< ul >
231
231
< li >
232
- < p > 选择基准值 pivot</ p >
232
+ < p > 选择基准值 pivot 将数组分成两个子数组:小于基准值的元素和大于基准值的元素。这个过程称之为 partition </ p >
233
233
</ li >
234
234
< li >
235
- < p > 将数组分成两个子数组:小于基准值的元素和大于基准值的元素。这个过程称之为 partition </ p >
235
+ < p > 对这两个子数组进行快速排序。 </ p >
236
236
</ li >
237
237
< li >
238
- < p > 对这两个子数组进行快速排序。 </ p >
238
+ < p > 合并结果 </ p >
239
239
</ li >
240
240
</ ul >
241
241
< p > 根据这个想法我们可以快速写出快排的代码,简直就是在翻译上边的描述:</ p >
@@ -260,7 +260,7 @@ <h1 id="_1">快速排序</h1>
260
260
< p > 是不是很简单,下次面试官让你手写快排你再写不出来就有点不太合适啦。 当然这个实现有两个不好的地方:</ p >
261
261
< ul >
262
262
< li > 第一是它需要额外的存储空间,我们想实现 inplace 原地排序。</ li >
263
- < li > 第二是它的 partion 操作每次都要两次遍历整个数组,我们想改善一下。</ li >
263
+ < li > 第二是它的 partition 操作每次都要两次遍历整个数组,我们想改善一下。</ li >
264
264
</ ul >
265
265
< p > 这里我们就来优化一下它,实现 inplace 排序并且改善下 partition 操作。新的代码大概如下:</ p >
266
266
< pre > < code class ="py "> def quicksort_inplace(array, beg, end): # 注意这里我们都用左闭右开区间,end 传入 len(array)
@@ -317,6 +317,7 @@ <h1 id="_3">思考题</h1>
317
317
< li > 选择基准值如果选不好就可能导致复杂度升高,算导中提到了一种『median of 3』策略,就是说选择 pivot 的时候
318
318
从子数组中随机选三个元素,再取它的中位数,你能实现这个想法吗?这里我们的代码很简单地取了第一个元素作为 pivot</ li >
319
319
< li > 利用快排中的 partition 操作,我们还能实现另一个算法,nth_element,快速查找一个无序数组中的第 k 大元素,请你尝试实现它并编写单测</ li >
320
+ < li > 你知道 Python 内置的 sorted 如何实现的吗?请你 Google 相关资料了解下。很多内置的排序都使用了快排的改良版。</ li >
320
321
</ ul >
321
322
< h1 id ="_4 "> 延伸阅读</ h1 >
322
323
< ul >
Original file line number Diff line number Diff line change @@ -481,5 +481,5 @@ <h2 id="_19">本电子书制作和写作方式</h2>
481
481
482
482
<!--
483
483
MkDocs version : 0.17.3
484
- Build Date UTC : 2018-05-16 00:34:57
484
+ Build Date UTC : 2018-05-17 00:54:17
485
485
-->
You can’t perform that action at this time.
0 commit comments