目录
一、插入排序
1.插入排序概念
注意:对于少量元素的排序,它是一个有效的算法
插入排序简单来说就像许多人排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面朝下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的牌进行比较。
2.代码实现
思路:
- 第一步:遍历列表
- 第二步:从列表的第一个元素开始,每一次循环都从右向左依次比较大小,并且交换
def insertSort(number):
for num in range(len(number)):
i = num
while number[i-1] >= number[i] and i-1 >= 0:
number[i-1], number[i] = number[i], number[i-1]
i -= 1
return number
if __name__ == '__main__':
list1 = [32, 19, 77, 8, 3, 9, 20, 31, -7, -22, 60]
print(insertSort(list1))
3.时间复杂度
- 最好的情况下(也就是完全有序的情况),插入排序次只需要比较一次,时间复杂度为O(n)。
- 最坏的情况下(也就是完全逆序的情况),每一次循环都需要把未排序的元素插入到已排序的序列第一位,时间复杂度为O(n^2)
二、归并排序
1.归并排序概念
归并排序算法完全遵循分治模式,在每层递归时都有三个步骤:
- 分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列
- 解决:使用归并排序递归的排序两个子序列
- 合并:合并两个已排序的子序列,以产生最后的排序结果
2.代码实现
def merge(left, right): # 步骤二:进行排序
result = []
l = r = 0 # l为left列表的下标,r为right列表的下标,
while l < len(left) and r < len(right):
if left[l] <= right[r]:
result.append(left[l])
l += 1
else:
result.append(right[r])
r += 1
if l == len(left):
for i in right[r:]:
result.append(i)
else:
for i in left[l:]:
result.append(i)
return result
def merge_sort(number): # 步骤一:将整个序列一分为二
if len(number) <= 1:
return number
else:
middle = len(number) // 2
left_index = merge_sort(number[0:middle])
right_index = merge_sort(number[middle:])
return merge(left_index, right_index)
if __name__ == '__main__':
list1 = [10, 3, 28, -5, -6, 11, 50, 77, 35]
print(merge_sort(list1))
3.时间复杂度
虽然待排序的元素数量不是偶数时也能正确的工作,但是假定原问题规模是2的幂,那么基于递归式的分析将被简化。这时每个分解步骤将产生规模刚好为n/2的两个子序列,直到子序列中只有一个元素的时候,停止分解。
所以时间复杂度为:
- 若n(原问题规模)=1,T(n)=c
- 若n>1,T(n) = 2T(n/2) + cn