一、简介
选择排序算法是一种不稳定排序算法(见参考资料2中的讨论),时间复杂度为O(n^2^)
,但由于交换次数较少,性能略优于冒泡排序。
基本思想是在第i
次遍历时,在第i+1
至第n
个元素中,选出最小的元素作为有序序列的第i
个元素。
二、算法介绍
以下面的数组为例,对其使用选择排序法进行升序排序:
901050803070406020
mi
用于记录每次遍历时最小元素的位置,开始遍历时令mi=i
,若li[j] < li[mi]
,则令mi=j
,并交换两元素位置。
i=0
时:j
从1
处开始遍历,得出mi=1
,数组li
变为:
109050803070406020i=1
时:j
从2
处开始遍历,得出mi=8
,数组li
变为:
102050803070406090i=2
时:j
从3
处开始遍历,得出mi=4
,数组li
变为:
102030805070406090i=3
时:j
从4
处开始遍历,得出mi=6
,数组li
变为:
102030405070806090i=4
时:j
从5
处开始遍历,得出mi=4
,数组li
变为:
102030405070806090i=5
时:j
从6
处开始遍历,得出mi=7
,数组li
变为:
102030405060807090i=6
时:j
从7
处开始遍历,得出mi=7
,数组li
变为:
102030405060708090i=7
时:j
从8
处开始遍历,得出mi=7
,数组li
变为:
102030405060708090
三、代码实现
def selectSort(li):
"""
简单选择排序,不稳定排序,每次循环找到最小的值并移动至i处
时间复杂度O(n2),但交换次数少,性能上略优于冒泡排序
"""
for i in range(len(li)):
mi = i
for j in range(i+1, len(li)):
if li[j] < li[mi]:
mi = j
# 若最小元素位置不为i,则交换两元素位置
if mi != i:
li[i], li[mi] = li[mi], li[i]
return li
if __name__ == '__main__':
li = [9, 1, 5, 8, 3, 7, 4, 6, 2]
print('选择排序:', selectSort(li.copy()))
参考资料:
[1] 《大话数据结构》
[2] 选择排序究竟属于稳定排序还是不稳定排序?——知乎
排序算法系列——相关文章:
[1] 排序算法(一)——冒泡排序算法详解及Python实现
[2] 排序算法(二)——简单选择排序算法详解及Python实现
[3] 排序算法(三)——直接插入排序算法详解及Python实现
[4] 排序算法(四)——希尔排序算法详解及Python实现
[5] 排序算法(五)——堆排序算法详解及Python实现
[6] 排序算法(六)——归并排序算法详解及Python实现
[7] 排序算法(七)——快速排序算法详解及Python实现