Skip to content

Commit 7ff0218

Browse files
committed
添加选择排序算法
1 parent 8e6cfa6 commit 7ff0218

File tree

4 files changed

+66
-0
lines changed

4 files changed

+66
-0
lines changed
41.2 KB
Loading
13.1 KB
Loading

selection_sort/readme.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# 选择排序
2+
3+
## 引言
4+
5+
## 概念
6+
这是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的**起始位置**,然后,再从**剩余未排序**元素中继续寻找最小(大)元素,然后放到**已排序**序列的**末尾**。以此类推,直到所有元素均排序完毕。
7+
8+
**注意**:在排序算法中,我们默认序列内部元素是可比较的,否则无意义。
9+
10+
## 图示
11+
12+
![选择排序算法](./img/Selection_sort_animation.gif)
13+
14+
![选择排序动画示例](./img/Selection-Sort-Animation.gif)
15+
16+
红色表示当前未排序序列中的最小值,黄色表示已排序序列,蓝色表示搜寻操作。
17+
18+
## 复杂度
19+
20+
O(n^2)
21+
22+
```bash
23+
n*(n-1)*……*1 = (n^2)/2 >> O(n^2)
24+
```
25+

selection_sort/selection_sort.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
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 selection_sort(unsorted_collection):
15+
"""
16+
选择排序
17+
18+
如何找到一个数组中最小的元素呢?先取出序列中的首个元素(index=0),然后循环序列,如果后面的元素中有比该元素更小的,则新元素取而代之;否则,则为该元素。
19+
对于剩下的序列(即未排序的序列),重复上面的操作,直至遍历整个序列。
20+
21+
:param unsorted_collection: 未排序的序列,其中元素必须是可比较的。
22+
:return:
23+
"""
24+
count = 0
25+
length = len(unsorted_collection)
26+
for i in range(length - 1):
27+
least = i # 第一次循环,直接拿第一个作为基准去和剩余的元素进行比较
28+
for k in range(i + 1, length):
29+
if unsorted_collection[k] < unsorted_collection[least]: # 如果发现原以为最小的比剩余序列中元素大(此处为顺排,如果逆序,应为大于)
30+
count += 1
31+
least = k # 则指定最小的为新发现的元素(此处是索引重新赋值)
32+
# 交换位置
33+
unsorted_collection[least], unsorted_collection[i] = unsorted_collection[i], unsorted_collection[least]
34+
print(f'It takes {count} times.')
35+
return unsorted_collection
36+
37+
38+
if __name__ == '__main__':
39+
unsorted_li = utils.rand_list()
40+
print('Before sorted:', unsorted_li)
41+
print('After sorted:', selection_sort(unsorted_li))

0 commit comments

Comments
 (0)