概述
将这两个排序算法一起讲解是因为这两个排序算法的共同特点是将需要排序的序列视为两部分。即已完成排序的部分和未完成排序的部分。每执行完一轮操作后,未完成排序的部分将得到的极值返回到完成排序的部分的末尾。
选择排序
算法概述
选择排序的工作原理具体如下,
- 首先在未排序的序列中寻找最小或者最大的元素,存放到排序序列的起始位置。
- 再从剩余的未排序的元素中寻找最小或最大的元素,存放到已排序序列的末尾。
以此类推,直到所有的元素都排序完毕。
以下面的一个序列为例进行演示(每次选出未排序部分最小的元素),
# 初始状态
[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) |
插入排序具有稳定性。