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