概要
-IDE:Pycharm
-Python版本:python3.x
-算法分类:内部排序->选择类排序->简单选择排序
算法思想
第一趟简单选择排序时,从第一个记录开始,通过
n−1
n
−
1
次关键字比较,从
n
n
个记录中选出关键字最小的记录,并和第一个记录进行交换。
第二趟,从第二个记录开始,通过次比较,选出最小的与第二个记录交换。
反复如此,经过
n−1
n
−
1
次简单选择排序,将把
n−1
n
−
1
个记录排到位,剩下的一个最小记录直接在最后,所以共需进行
n−1
n
−
1
趟简单选择排序。
算法分析
最好情况下,即待排序记录初始状态是正序,则不需要移动记录,最坏情况是倒序,此时移动的最多为
3(n−1)
3
(
n
−
1
)
次。
简单选择排序过程中需要进行的比较次数与初始状态无关,总共需要比较
∑n−1i=1=(n−1)+(n−2)+...+1=n(n−1)2
∑
i
=
1
n
−
1
=
(
n
−
1
)
+
(
n
−
2
)
+
.
.
.
+
1
=
n
(
n
−
1
)
2
稳定性与时间复杂度
排序算法 | 稳定性 | 时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 |
---|---|---|---|---|---|
简单选择 | 不稳定 | O(n2) O ( n 2 ) | O(n2) O ( n 2 ) | O(n2) O ( n 2 ) | O(1) O ( 1 ) |
Python代码清单
# !/usr/bin/python3
# _*_ coding:utf-8 _*_
# 选择排序。
import sys, time, random
def SS(number, maxNumber):
timeStart = time.time() # 记录开始时间。
listA = [] # 设置list容器
for i in range(number): # 循环生成列表元素
listA.append(random.randint(0, maxNumber)) # 添加到列表
timeEnd = time.time() # 记录结束时间
tiemIs = timeEnd-timeStart # 计算耗时
print('生成%d个数花费的时间是%f' % (number, tiemIs)) # 打印信息。
# print(listA) # 打印生成的列表。
############################################################
# 快速排序。
# aim = 0 # aim 用于存储找到的最小值。
timeStart = time.time() # 记录开始时间。
for item in range(number-1): # 外层循环,
i = item # 记录当前元素位置,也是目标位置,也是第一个比较元素。
temp = listA[i] # 记录当前元素的值
for item2 in range(item+1, number): # 内层循环。
if listA[item2] < listA[i]: # 判断的大小。
i = item2 # 更新比较元素。
listA[item] = listA[i] # 将最小的元素放到目标位
listA[i] = temp # 将目标位的元素送到当前位。
# print(listA[item])
timeEnd = time.time() # 记录结束时间。
timeIs = timeEnd - timeStart # 计算消耗时间。
print('排序%d个数花费的时间是%f' % (number, timeIs)) # 打印输出相关信息。
# print(listA) # 打印输出列表。
if __name__ == '__main__':
helpInfo = '''
This program is for Select Sort.
How to use it! Follow the example!
python Select_Sort.py 10 100
The 10 representative will generate ten numbers.
100 representative the max-number you make.
'''
command = sys.argv[0:] # 从键盘上获取输入。
if len(command) != 3 or 'help' in command: # 判断输入是否合法,或者有请求帮助的词。
print(helpInfo) # 打印帮助语句。
else:
try:
number = int(command[1]) # 尝试将字符转化为int型数值。
maxNumber = int(command[2])
except ValueError: # 转化失败,发生ValueError。
print(helpInfo) # 打印帮助文本。
sys.exit(1) # 以异常的方式退出程序
SS(number, maxNumber) # 一切正常,开始调用函数。
有什么问题请联系我
QQ:3116316431 (请附上信息)
E-mail:wongyinlong@yeah.net