假定:有 1 个乱序的数列 nums ,其中有 n 个数。
要求:排好序之后是 从小到大 的顺序。
选择排序算法
代码
from swap import swap
def select_sort(nums):
n = len(nums)
i = 0
while i <= n-2:
minIndex = i
j = i+1
while j <= n-1:
if nums[j] < nums[minIndex]:
minIndex = j
j += 1
swap(nums, i, minIndex)
i +=1
def select_sort_better(nums):
n = len(nums)
i = 0
while i <= n-2:
minIndex = i
j = i+1
while j <= n-1:
if nums[j] < nums[minIndex]:
minIndex = j
j += 1
if minIndex != i:
swap(nums, minIndex, i)
i += 1
我的理解
每 1 轮外循环中,
minIndex 的初始值总是 i ,
j 的初始值总是 i+1,即 nums[j] 的初始值总是 nums[i] 相邻的右边的 1 个值,
内循环中,
nums[j] 遍历从 i+1 到 n-1 的所有值,如果出现比 nums[minIndex] 小的值,
则用 minIndex 暂存较小值,
内循环结束,跳出内循环时,minIndex 存放从 i+1 到 n-1 的所有值中的最小值的下标。
内循环结束后,交换 nums(minIndex) 与 nums(i) 的值,即将 i+1 到 n-1 中的最小值放到 i 位置上,
造成的效果是,最小值总是从左到右排列。
指针 i 向右移动,进入下一轮外循环。
原理
略
算法复杂度
时间复杂度:
最坏情况下 ;
最好情况下 ;
平均情况 。
空间复杂度:
。
稳定性
。
参考文献
- 《数据结构 Python 语言描述》 - Lambert -
- 《数据结构(第 2 版)》 - 浙江大学 - ;
- 《数据结构与算法 Python 语言描述》 - 裘宗燕 - 北京大学 - 。