排序算法之python简单选择排序

简单选择排序

介绍:

    简单选择排序是一种选择排序。每趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录序列末尾,直到全部排序结束为止

思想:

选择排序思想很简单,就是每次从待排序列中找出关键字最小的元素,放入已经排好的序列中,本质上就是第一次在后面选出最小的元素就是最终序列的第一小元素,第二次在后面选出的最小元素就是最终序列的第二小元素,如此重复,直到待排序列为空。其实这个排序有点类似于冒泡排序,冒泡排序是每一趟都把最大的往后移,即确定一个第几大的元素;而简单选择排序是每一趟都是把小的往前挪,确定一个第几小的元素。

代码:

def SelectSort(input_list):
	l = len(input_list)
	if l == 0:
		return []
	sorted_list = input_list
	for i in range(l):
		#默认第i个元素是每次的最小值的索引
		min_index = i
		#找到后面元素最小的索引
		for j in range(i+1,l):
			if sorted_list[min_index] >sorted_list[j]:
				min_index = j
		#将找到的最小元素放入前面已经有序序列的末尾
		temp = sorted_list[i]
		sorted_list[i] = sorted_list[min_index]
		sorted_list[min_index] = temp
		print("%dth"%(i+1))
		print(sorted_list)
	return sorted_list
			
	
	
		
if __name__ == '__main__':
	input_list = [50,123,543,187,49,30,0,2,11,100]
	print("input_list:")
	print(input_list)
	sorted_list = SelectSort(input_list)
	print("sorted_list:")
	print(input_list)
	

结果:

input_list:
[50, 123, 543, 187, 49, 30, 0, 2, 11, 100]
1th
[0, 123, 543, 187, 49, 30, 50, 2, 11, 100]
2th
[0, 2, 543, 187, 49, 30, 50, 123, 11, 100]
3th
[0, 2, 11, 187, 49, 30, 50, 123, 543, 100]
4th
[0, 2, 11, 30, 49, 187, 50, 123, 543, 100]
5th
[0, 2, 11, 30, 49, 187, 50, 123, 543, 100]
6th
[0, 2, 11, 30, 49, 50, 187, 123, 543, 100]
7th
[0, 2, 11, 30, 49, 50, 100, 123, 543, 187]
8th
[0, 2, 11, 30, 49, 50, 100, 123, 543, 187]
9th
[0, 2, 11, 30, 49, 50, 100, 123, 187, 543]
10th
[0, 2, 11, 30, 49, 50, 100, 123, 187, 543]
sorted_list:
[0, 2, 11, 30, 49, 50, 100, 123, 187, 543]

分析:

1.算法性能

2.时间复杂度

简单选择排序的比较次数与序列的初始排序无关。 假设待排序的序列有 N 个元素,则比较次数总是N (N - 1) / 2。而移动次数与序列的初始排序有关。当序列正序时,移动次数最少为 0;当序列反序时,移动次数最多,为3N (N - 1) /  2。所以,简单排序的时间复杂度为 O(N^2)。

3、空间复杂度

需要一个临时变量保存最小索引,O(1)

3.算法稳定性

不稳定,例如待排序列为{5,2,5',1},第一次将5作为初始最小元素,遇到5'就把5'与5的位置对换了,故该算法是不稳定的。

猜你喜欢

转载自blog.csdn.net/lerry13579/article/details/82051883
今日推荐