Skip to content

Commit 22c5738

Browse files
committed
对排序算法进行整个>>sorts;添加快速排序算法
1 parent 86bc9e3 commit 22c5738

File tree

8 files changed

+81
-2
lines changed

8 files changed

+81
-2
lines changed
90.8 KB
Loading

sorts/quick_sort/quick_sort.py

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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))

sorts/quick_sort/readme.md

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
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)

sorts/readme.md

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# 排序算法
2+
3+
**注意**:在排序算法中,我们默认讨论的序列内部元素是可比较的,否则无意义。
4+
5+
- [选择排序](./selection_sort)
6+
- [快速排序](./quick_sort)
7+
8+
9+
10+

selection_sort/readme.md renamed to sorts/selection_sort/readme.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# 选择排序
22

33
## 概念
4-
这是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的**起始位置**,然后,再从**剩余未排序**元素中继续寻找最小(大)元素,然后放到**已排序**序列的**末尾**。以此类推,直到所有元素均排序完毕。
4+
这是一种简单直观的排序算法。它的工作原理如下:
5+
首先在未排序序列中找到最小(大)元素,存放到排序序列的**起始位置**,然后,再从**剩余未排序**元素中继续寻找最小(大)元素,然后放到**已排序**序列的**末尾**。以此类推,直到所有元素均排序完毕。
56

67
**注意**:在排序算法中,我们默认序列内部元素是可比较的,否则无意义。
78

selection_sort/selection_sort.py renamed to sorts/selection_sort/selection_sort.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import pathlib
66
import sys
77

8-
util_p = pathlib.Path('..').resolve()
8+
util_p = pathlib.Path('../..').resolve()
99

1010
sys.path.append(str(util_p))
1111
from util import utils

0 commit comments

Comments
 (0)