本关任务:首先给定一个长度大于1而且是乱序的列表,列表元素类型为整型,让后利用选择排序对列表元素进行排序,并输出每一次循环之后的结果。
选择排序是一种最简单的排序思想。它的工作原理是:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
首先把第一位和其他所有的元素按顺序进行比较,将第一个比第一位小的元素的索引赋值给min
,然后再用索引为min
的元素和其他没比完的元素比较,如果还有比他小的就将他的索引赋值给min
,最后就把索引为min
的元素换到第一个位置来,比较完后,第一位就是最小的,然后再从第二位和剩余的其他所有进行比较,以此类推,每循环一次,有序数列的长度就会加1,直到排序完成。 如图所示:
需要遍历数组才能找到峰值元素,所以复杂度与原始序列是否有序无关,最好最坏和平均情况的时间复杂度都为O(n2)。
算法如果不亲自实践一遍是很容易忘记的,所以请再右侧代码编辑器中补全Python代码。选择排序需要用到for循环的嵌套。
平台会对你编写的代码进行测试:
测试输入:
6,84,8,31,22,5,2,33
;
预期输出:
[2, 84, 8, 31, 22, 5, 6, 33]
[2, 5, 8, 31, 22, 84, 6, 33]
[2, 5, 6, 31, 22, 84, 8, 33]
[2, 5, 6, 8, 22, 84, 31, 33]
[2, 5, 6, 8, 22, 84, 31, 33]
[2, 5, 6, 8, 22, 31, 84, 33]
[2, 5, 6, 8, 22, 31, 33, 84]
排序之后的结果为:[2, 5, 6, 8, 22, 31, 33, 84]
测试输入2:
4,16,4,23,51,99,68,48,66,98,15,23
预期输出2: [4, 4, 16, 23, 51, 99, 68, 48, 66, 98, 15, 23]
[4, 4, 15, 23, 51, 99, 68, 48, 66, 98, 16, 23]
[4, 4, 15, 16, 51, 99, 68, 48, 66, 98, 23, 23]
[4, 4, 15, 16, 23, 99, 68, 48, 66, 98, 51, 23]
[4, 4, 15, 16, 23, 23, 68, 48, 66, 98, 51, 99]
[4, 4, 15, 16, 23, 23, 48, 68, 66, 98, 51, 99]
[4, 4, 15, 16, 23, 23, 48, 51, 66, 98, 68, 99]
[4, 4, 15, 16, 23, 23, 48, 51, 66, 98, 68, 99]
[4, 4, 15, 16, 23, 23, 48, 51, 66, 68, 98, 99]
[4, 4, 15, 16, 23, 23, 48, 51, 66, 68, 98, 99]
排序之后的结果为:[4, 4, 15, 16, 23, 23, 48, 51, 66, 68, 98, 99]
# 选择排序
arraystr = input().split(',')
array = [int(i) for i in arraystr]
def selectsort(array):
# ********* Begin *********
for i in range(len(array) - 1): # 确定循环次数;答案中应少循环一次,但题中保留最后一次循环
min = i
for j in range(i + 1, len(array)): # 设立新的循环模式,方便比较自身与之后数字的大小
if array[j] < array[min]:
min = j
array[i], array[min] = array[min], array[i] # 调换数字位置
print(array)
# ********* End *********
return array
print("排序之后的结果为:{}".format(selectsort(array)))