选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
选择排序的交换操作介于 0 和 (n - 1) 次之间。选择排序的比较操作为 n (n - 1) / 2 次之间。选择排序的赋值操作介于 0 和 3 (n - 1) 次之间。
比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+…+1=n*(n-1)/2。交换次数O(n),最好情况是,已经有序,交换0次;最坏情况交换n-1次,逆序交换n/2次。交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快
算法步骤
-
算法步骤
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。 -
再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
-
重复第二步,直到所有元素均排序完毕。
程序示例:
"""
题目:选择排序
作者:假书生@
version:1.0
date:2020.01.30
"""
import random # 导入random模块,用来生成随机数列
def select_sort (array): # 定义排序函数
for i in range(len(array)): # 定义外层循环,次数为列表长度
for j in range(i,len(array)): # 定义内层循环,次数为i->len(range)
if array[i] > array[j]: # 如果前面的大于后面的数,则进行交换
tmp = array[i]
array[i] = array[j]
array [j] = tmp
if __name__ == "__main__":
array = [] # 定义列表
for i in range(50): # 将列表赋予随机数
array.append(random.randrange(1000))
print(array)
select_sort(array) # 调用排序函数
print(array)
运行结果:
```clike
[334, 786, 16, 925, 548, 790, 740, 728, 945, 732]
[16, 334, 548, 728, 732, 740, 786, 790, 925, 945]
我们还可以在外层循环中定义一个变量,用来指向最小值,这样可以减小交换的次数
优化版本如下:
程序示例:
"""
题目:选择排序
作者:假书生@
version:2.0
date:2020.01.30
"""
import random # 导入random模块,用来生成随机数列
def select_sort (array): # 定义排序函数
for i in range(len(array)):# 定义外层循环,次数为列表长度
smallest_index = i # 定义最小值为smallest_index
for j in range(i,len(array)): # 定义内层循环,次数为i->len(range)
if array[j] < array[smallest_index]: #如果遇到更小的数,将下标进行更改
smallest_index = j
tmp = array[i] # 进行交换
array[i] = array[smallest_index]
array [smallest_index] = tmp
if __name__ == "__main__":
array = [] # 定义列表
for i in range(10): # 将列表赋予随机数
array.append(random.randrange(1000))
print(array)
select_sort(array) # 调用排序函数
print(array)
运行结果:
[577, 27, 661, 435, 386, 273, 472, 47, 272, 223]
[27, 47, 223, 272, 273, 386, 435, 472, 577, 661]