Skip to content

Commit c396945

Browse files
committed
python buildin sort
1 parent e7f2a40 commit c396945

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

docs/13_高级排序算法/quick_sort.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
# 快速排序
22

33
快速排序名字可不是盖的,很多程序语言标准库实现的内置排序都有它的身影,我们就直奔主题吧。
4-
和归并排序一样,快排也是一种分而治之的策略。归并排序把数组递归成只有单个元素的数组,之后再不断两两
4+
和归并排序一样,快排也是一种分而治之(divide and conquer)的策略。归并排序把数组递归成只有单个元素的数组,之后再不断两两
55
合并,最后得到一个有序数组。这里的递归基本条件就是只包含一个元素的数组,当数组只包含一个元素的时候,我们可以认为它本来就是有序的(当然空数组也不用排序)。
66

77
快排的工作过程其实比较简单,三步走:
88

9-
- 选择基准值 pivot
10-
11-
- 将数组分成两个子数组:小于基准值的元素和大于基准值的元素。这个过程称之为 partition
9+
- 选择基准值 pivot 将数组分成两个子数组:小于基准值的元素和大于基准值的元素。这个过程称之为 partition
1210

1311
- 对这两个子数组进行快速排序。
1412

13+
- 合并结果
14+
15+
1516
根据这个想法我们可以快速写出快排的代码,简直就是在翻译上边的描述:
1617

1718
```py
@@ -35,7 +36,7 @@ def test_quicksort():
3536
是不是很简单,下次面试官让你手写快排你再写不出来就有点不太合适啦。 当然这个实现有两个不好的地方:
3637

3738
- 第一是它需要额外的存储空间,我们想实现 inplace 原地排序。
38-
- 第二是它的 partion 操作每次都要两次遍历整个数组,我们想改善一下。
39+
- 第二是它的 partition 操作每次都要两次遍历整个数组,我们想改善一下。
3940

4041
这里我们就来优化一下它,实现 inplace 排序并且改善下 partition 操作。新的代码大概如下:
4142

@@ -101,6 +102,7 @@ T(n) = 2T(n/2) + n
101102
- 选择基准值如果选不好就可能导致复杂度升高,算导中提到了一种『median of 3』策略,就是说选择 pivot 的时候
102103
从子数组中随机选三个元素,再取它的中位数,你能实现这个想法吗?这里我们的代码很简单地取了第一个元素作为 pivot
103104
- 利用快排中的 partition 操作,我们还能实现另一个算法,nth_element,快速查找一个无序数组中的第 k 大元素,请你尝试实现它并编写单测
105+
- 你知道 Python 内置的 sorted 如何实现的吗?请你 Google 相关资料了解下。很多内置的排序都使用了快排的改良版。
104106

105107

106108
# 延伸阅读

0 commit comments

Comments
 (0)