简介
在一趟排序过程中记录最小的数,放到第一个位置上;
再来一趟排序记录无序区最小的数,放到第二个位置上;
依次类推…
时间复杂度
最坏情况:O( n 2 n^2 n2)
平均情况:O( n 2 n^2 n2)
最好情况:O( n 2 n^2 n2)
空间复杂度
O(1)
稳定性
不稳定
复杂性
简单
关键点
趟数:n - 1
无序区范围:趟数 + 1 ~ n
代码示例
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""选择排序
在一趟排序中记录最小的数,放到第一个位置上。
再一趟排序记录列表无序区中最小的数,放到第二个位置上。
依次类推...
时间复杂度:
最坏情况:O(n^2)
平均情况:O(n^2)
最好情况:O(n^2)
空间复杂度:O(1)
稳定性:不稳定
复杂性:简单
关键点:
1. 趟数(n - 1)
2. 无序范围(趟数 + 1, n)
3. 记录最小数的下标
"""
import random
def select_sort(ls, reverse=False):
"""选择排序
Args:
:param ls: list, 待排序的列表
:param reverse: bool, 升序还是降序,默认升序
"""
length = len(ls)
# 决定是升序还是降序
# symbol = {'gt': '>', 'lt': '<'}
# default_symbol = symbol['gt']
# if reverse:
# default_symbol = symbol['lt']
# con_tpl = f'ls[min_loc] {default_symbol} ls[j]'
for i in range(length - 1):
min_loc = i # 假定无序区第一个数最小
for j in range(i + 1, length):
# if eval(con_tpl):
if ls[min_loc] > ls[j]:
min_loc = j
if min_loc != i:
ls[i], ls[min_loc] = ls[min_loc], ls[i]
ls = [random.randint(0, 100) for _ in range(10)]
print(ls)
select_sort(ls, reverse=True)
print(ls)