选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。
选择排序分析
排序过程:
实现
'''
min_index = 0 , [1,2,3,...,n-1] , for j in range(1,n)
min_index = 1 , [2,3,4,...,n-1] , for j in range(2,n)
min_index = 2 , [3,4,5,...,n-1] , for j in range(3,n)
min_index = 3 , [4,5,6,...,n-1] , for j in range(4,n)
.
.
.
min_index = i , [i+1,5,6,...,n-1] , for j in range(i+1,n)
时间复杂度:O(n2)
稳定性:不稳定(考虑升序每次选择最大的情况)
'''
def SelectSort(alist):
'''选择排序'''
n = len(alist)
for i in range(n-1):
# 把未排序的第一个看做最小,依次与后面未排序的进行比较
min_index = i
for j in range(i+1, n):
# 如果不是最小,让min_index等于最小数的下标
if alist[min_index] > alist[j]:
min_index = j
# 比较结束后,即找出了最小的值,把它放在已排序的后面
alist[i], alist[min_index] = alist[min_index], alist[i]
if __name__ == '__main__':
alist = [3,4,6,34,1,2,43,5,8,6,56,9,7,4]
print(alist)
select_sort = SelectSort(alist)
print(alist)
运行结果:
/home/longhui/Desktop/数据结构与算法/venv/bin/python /home/longhui/Desktop/数据结构与算法/venv/MyCode/6_sorting_and_searching/selection_sort.py
[3, 4, 6, 34, 1, 2, 43, 5, 8, 6, 56, 9, 7, 4]
[1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 9, 34, 43, 56]
Process finished with exit code 0
时间复杂度
- 最优时间复杂度:O(n2)
- 最坏时间复杂度:O(n2)
- 稳定性:不稳定(考虑升序每次选择最大的情况)