File tree 8 files changed +81
-2
lines changed
8 files changed +81
-2
lines changed Original file line number Diff line number Diff line change
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # Created by imoyao at 2019/5/13 18:33
4
+
5
+ import pathlib
6
+ import sys
7
+
8
+ util_p = pathlib .Path ('../..' ).resolve ()
9
+
10
+ sys .path .append (str (util_p ))
11
+ from util import utils
12
+
13
+
14
+ def quick_sort (unsorted_collection ):
15
+ """
16
+ 快速排序
17
+ 先找到一个比较基准,然后将列表中剩余元素与这个基准进行比较,如果小于,则放在左边的序列;大于则放在右边;最后把三个序列按顺序连接起来
18
+ :param unsorted_collection:待排序序列
19
+ :return:排序后序列
20
+ """
21
+ if len (unsorted_collection ) <= 1 : # 在序列中只有一个元素时,我们不用比较元素大小,本身就是有序序列
22
+ return unsorted_collection
23
+ cmp_base = unsorted_collection [0 ] # 取出第一个作为比较基准
24
+ left_col = [item for item in unsorted_collection [1 :] if item <= cmp_base ] # 如果希望降序排列,只需分治点两边调换即可
25
+ right_col = [item for item in unsorted_collection [1 :] if item > cmp_base ]
26
+ return quick_sort (left_col ) + [cmp_base ] + quick_sort (right_col ) # 对左右两边的序列使用递归,之后拼接;注意中间的元素要“还原”
27
+
28
+
29
+ @utils .show_time
30
+ def compute_time (unsorted_collection ):
31
+ return quick_sort (unsorted_collection )
32
+
33
+
34
+ if __name__ == '__main__' :
35
+ unsorted_li = utils .rand_list (100 )
36
+ print ('Before sorted:' , unsorted_li )
37
+ print ('After sorted:' , quick_sort (unsorted_li ))
Original file line number Diff line number Diff line change
1
+ # 快速排序
2
+
3
+ 在了解快排之前,先了解一种思想——分而治之
4
+
5
+ ## 分而治之思想 (Divide and Conquer)
6
+
7
+ 很多有用的算法结构上是递归的,为了解决一个特定问题,算法一次或者多次递归调用其自身以解决若干子问题。 这些算法典型地遵循分治法的思想:将原问题分解为几个规模较小但是类似于原问题的子问题,递归求解这些子问题, 然后再合并这些问题的解来建立原问题的解。
8
+
9
+ 分治法在每层递归时有三个步骤:
10
+
11
+ 1 . ** 分解** 原问题为若干子问题,这些子问题是原问题的规模最小的实例
12
+ 2 . ** 解决** 这些子问题,递归地求解这些子问题。当子问题的规模足够小,就可以直接求解(大白话来说就是一眼可以看出来结果的)
13
+ 3 . ** 合并** 这些子问题的解成原问题的解
14
+
15
+ ## 概念
16
+ 简称快排,一种排序算法,最早由东尼·霍尔提出。在平均状况下,排序` n ` 个项目要 ` O(n log n) ` 次比较。在最坏状况下则需要 ` O(n^2) ` 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地达成。
17
+
18
+
19
+ ## 图示
20
+
21
+ ![ 快速排序算法] ( ./img/quick_sort_anim.gif )
22
+
23
+ ## 复杂度
24
+
25
+ 最糟糕复杂度:O(n^2);平均复杂度:O(n* log n)
26
+
27
+ 由于关键字的比较和交换是跳跃进行的,因此,快速排序是一种不稳定的排序方法。
28
+
29
+ ## 更多
30
+
31
+ [ 快速排序最好,最坏,平均复杂度分析] ( https://blog.csdn.net/weshjiness/article/details/8660583 )
Original file line number Diff line number Diff line change
1
+ # 排序算法
2
+
3
+ ** 注意** :在排序算法中,我们默认讨论的序列内部元素是可比较的,否则无意义。
4
+
5
+ - [ 选择排序] ( ./selection_sort )
6
+ - [ 快速排序] ( ./quick_sort )
7
+
8
+
9
+
10
+
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change 1
1
# 选择排序
2
2
3
3
## 概念
4
- 这是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的** 起始位置** ,然后,再从** 剩余未排序** 元素中继续寻找最小(大)元素,然后放到** 已排序** 序列的** 末尾** 。以此类推,直到所有元素均排序完毕。
4
+ 这是一种简单直观的排序算法。它的工作原理如下:
5
+ 首先在未排序序列中找到最小(大)元素,存放到排序序列的** 起始位置** ,然后,再从** 剩余未排序** 元素中继续寻找最小(大)元素,然后放到** 已排序** 序列的** 末尾** 。以此类推,直到所有元素均排序完毕。
5
6
6
7
** 注意** :在排序算法中,我们默认序列内部元素是可比较的,否则无意义。
7
8
Original file line number Diff line number Diff line change 5
5
import pathlib
6
6
import sys
7
7
8
- util_p = pathlib .Path ('..' ).resolve ()
8
+ util_p = pathlib .Path ('../.. ' ).resolve ()
9
9
10
10
sys .path .append (str (util_p ))
11
11
from util import utils
You can’t perform that action at this time.
0 commit comments