排序专题(3)——选择排序、插入排序

概述

将这两个排序算法一起讲解是因为这两个排序算法的共同特点是将需要排序的序列视为两部分。即已完成排序的部分和未完成排序的部分。每执行完一轮操作后,未完成排序的部分将得到的极值返回到完成排序的部分的末尾

选择排序

算法概述

选择排序的工作原理具体如下,

  • 首先在未排序的序列中寻找最小或者最大的元素,存放到排序序列的起始位置。
  • 再从剩余的未排序的元素中寻找最小或最大的元素,存放到已排序序列的末尾。

以此类推,直到所有的元素都排序完毕。

以下面的一个序列为例进行演示(每次选出未排序部分最小的元素),

# 初始状态  
[54, 26, 93, 17, 77, 31, 44, 55, 20]

# 第一轮排序
min_index = 0    
[17, 	26, 93, 54, 77, 31, 44, 55, 20]

# 第二轮排序
min_index = 1    
[17, 20, 	93, 54, 77, 31, 44, 55, 26]

# 第三轮排序
min_index = 2    
[17, 20, 26,    54, 77, 31, 44, 55, 93]

# 第四轮排序
min_index = 3    
[17, 20, 26, 31,    77, 54, 44, 55, 93]

…………

# 第九轮排序
min_index = 8    
[17, 20, 26, 31, 44, 54, 55, 77, 93    ]

算法实现

实现数组的升序排列,

def select_sort(alist):
	n = len(alist)
	for i in range(n-1):
		min_idx = i
		for j in range(i+1, n):
			if alist[min_idx] > alist[j]:
				min_idx = j
		# 每一轮下来得到未排序部分最小元素的脚标 min_idx
		if min_idx != i:
			alist[i], alist[min_idx] = alist[min_idx], alist[i]
	return alist

算法时间复杂度与稳定性

复杂度说明
最优时间复杂度O(n2),第一轮进行n-1次比较,第二轮n-2次比较,……,即使在序列本身具有顺序的情况下,依旧需要比较 (n-1)+(n-2)+……+1次比较和0次交换,O((n2-n)/2)~O(n2)。
最坏时间复杂度O(n2),除了进行 n(n-1)/2 次操作外还需要额外的n-1次交换。但是整体的时间复杂度依旧是O(n2)。

选择排序不具有排序稳定性

插入排序

算法概述

插入排序从初始状态时就将整个序列视为两个部分。将右侧无序部分的第一个元素插入到左侧有序部分相应的位置

以下面的序列进行演示,

# 初始状态  
[54,     26, 93, 17, 77, 31, 44, 55, 20]

# 第一轮排序
index = 1    
[26, 54,    93, 17, 77, 31, 44, 55, 20]

# 第二轮排序
index = 2    
[26, 54, 93,    17, 77, 31, 44, 55, 20]

# 第三轮排序
index = 3    
[17, 26, 54, 93,    77, 31, 44, 55, 20]

# 第四轮排序
index = 4    
[17, 26, 54, 77, 93,    31, 44, 55, 20]

…………

# 第八轮排序
index = 8    
[17, 20, 26, 31, 44, 54, 55, 77, 93    ]

算法实现

依旧是实现序列的升序排列过程,

# 实现方式1
def insert_sort(alist):
	n = len(alist)
	for i in range(1, n):
		j = i
		while j > 0:
			if alist[j] > alist[j-1]:
				break
			else:
				alist[j], alist[j-1] = alist[j-1], alist[j]
			j -= 1
	return alist


# 实现方式2
def insert_sort(alist):
	n = len(alist)
	for i in range(1, n):
		for j in range(i, 0, -1):
			if alist[j] < alist[j-1]:
				alist[j], alist[j-1] = alist[j-1], alist[j]
			else:
				break
	return alist

算法时间复杂度及稳定性

复杂度说明
最优时间复杂度O(n),当序列本身就满足顺序要求时,仅相当于对序列进行遍历
最坏时间复杂度O(n2),当序列完全逆序排列时,第一次需要进行1次交换,第二次进行2次交换,……,一共需要O((n2-n)/2)次交换。~O(n2)

插入排序具有稳定性

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值