插入排序和希尔排序----》Python

插入排序

先定义一个有序序列,然后把无序序列的第一个元素放在有序序列的合适位置,重复操作

  • 最优时间复杂度:O(n) (升序排列,序列已经处于升序状态)
  • 最坏时间复杂度:O(n2)
  • 稳定性:稳定
def insert_sort(alist):
	'''插入排序'''
	n = len(alist)
	# 首先认定第一个元素是有序的,拿后面的元素跟前一个元素作比较,如果小,则两者比较。反之继续往前比较

	for i in range(1, n):
		while i > 0:
			if alist[i] < alist[i-1]:
				alist[i], alist[i-1] = alist[i-1], alist[i]
				i -= 1
			# 因为前面都是有序的,当前元素跟前一个元素比较如果大则不用跟前面之前所有元素比较了
			else:
				break


if __name__ == '__main__':
	li = [11,34,23,6574,32,78]
	print(li)
	insert_sort(li)
	print(li)

希尔排序

插入排序的高阶版本,每次不是跟前一个数比较,是跟前gap个数比较,gap可以自己定,最后gap为1时为插入排序结束循环。

  • 最优时间复杂度:根据步长序列的不同而不同
  • 最坏时间复杂度:O(n2)
  • 稳定想:不稳定
def shell_sort(alist):
	'''希尔排序'''
	# 通过步长来跟前gap个元素比较
	n = len(alist)
	gap = n // 2
	while gap >= 1:
		# 因为是通过gap来跟前边元素比较,有因为gap是总长的一半,所以从gap出开始循环判断
		for i in range(gap, n):
			while i > 0:
				if alist[i] < alist[i-gap]:
					alist[i], alist[i-gap] = alist[i-gap], alist[i]
					i -= gap
				else:
					break
		gap //= 2

if __name__ == '__main__':
	li = [11,34,23,6574,32,78]
	print(li)
	shell_sort(li)
	print(li)

猜你喜欢

转载自blog.csdn.net/qiuchiqiuyuan/article/details/88648166