参考:
百度百科:选择排序
选择排序(selection sort)
工作原理
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置(或末尾),直到全部待排序的数据元素排完。
算法思想
设待排序序列大小为 n
,从头到尾共遍历 n-1
次,i
表示当前遍历的次数,也表示已排序序列的终止位置和待排序序列的起始位置,从下标 i
开始在待排序序列中找出最小(或最大)的元素的下标 k
,其值和下标 i
的值进行交换
Python 算法实现
# -*- coding: utf-8 -*-
"""
选择排序
"""
import random
def create_data(leng, min, max):
"""
创建待排序序列
:param leng: 序列长度
:param min: 最小值
:param max: 最大值
:return: 列表
"""
li = range(min, max)
return random.sample(li, leng)
def selection_sort(li, reverse=False):
"""
选择排序实现
:param li: 待排序列表
:param reverse: 是否从大到小排序,默认为False
:return: 已排序列表
"""
for i in xrange(len(li) - 1):
k = i
for j in xrange(i + 1, len(li)):
if reverse:
if li[k] < li[j]:
k = j
else:
if li[k] > li[j]:
k = j
li[k], li[i] = li[i], li[k]
return li
if __name__ == '__main__':
da = create_data(10, 30, 60)
print da
selection_sort(da, True)
print da
性能分析
稳定性
选择排序是不稳定排序算法
比如待排序序列为 (4,0),(4,1),(2,2)
第一次遍历后,结果为 (2,2),(4,1),(4,0)
那么值为 4
的两个元素的相对位置在排序完成后发生了变化,所以选择排序是不稳定算法
时间复杂度
基本操作为
...
k = i
...
...
k = j
...
k = j
li[k], li[i] = li[i], li[k]
return li
T(n) = (n-1) + n*(n-1)/2 + (n-1)
最好,最坏,平均时间复杂度均为 O(n^2)
空间复杂度
仅使用了变量 k
,所以空间复杂度为 O(1)