一、算法思想
- 第1趟:比较第0个元素和第1个元素。。。比较第n-2个元素和第n-1个元素,将最大(小)的元素放在第n-1个元素位置
- 第2趟:比较第0个元素和第1个元素。。。比较第n-3个元素和第n-2个元素,将最大(小)的元素放在第n-2个元素位置
- …
- 第n-1趟:比较第0个元素和第1个元素,将最小(大)的元素放在第1个元素的位置
- 每次循环i[0,n-2]
- 每次判断相邻位置元素(相邻元素范围[0,n-i-1])的大小,如果前者大于后者,就交换顺序,最终将此次循环的最大元素放在n-i-1的位置上
二、算法分析
平均时间复杂度:O(n^2)
空间复杂度:O(1) (用于记录是否发生交换——flag)
稳定性:稳定
(通俗地讲就是,能保证排序前两个相等的数其在序列的前后位置顺序与排序后它们的前后位置顺序一致)
(比如序列【5, 5, 3】第一趟就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)
三、代码
import random
def selectSort(lst, reverse = False):
length = len(lst)
for i in range(0, length): # 本质只是循环到 n-3 ,这么写是简化写法
# 假设剩余的n-i个元素中第一个最小(大)
# 最小值索引
m = i
# 扫描剩余元素
for j in range(i+1, length):
# 如果有更小(大)的,就记录他的位置
exp = 'lst[m] > lst[j]'
if reverse:
exp = 'lst[m] < lst[j]'
if eval(exp):
m = j
# 如果发现比当前位置更小(大)的,就交换值
if m != i:
lst[m], lst[i] = lst[i], lst[m]
if __name__ == "__main__" :
lst = [random.randint(0,10) for i in range(10)] # 随机产生一个长度为10的列表
print('初始序列:',lst)
# 测试选择排序
selectSort(lst = lst, reverse = True)
print('排序后:',lst)
四、运行结果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c3dcf06b6ecccd95e24d27650f96d727.png)