快速排序和归并排序
快速排序过程:
选择一个元素(通常为序列的第一位元素),将其分别与 序列中其他元素比较大小,将大于其值的元素放在 参照元素的右边,小于的放在其左边,之后 按照上面的过程分别 递归处理 新的序列的左右(参照元素作为划分界限)两部分,直到序列长度为1时,递归完成,则排序也结束了。
快速排序的时间复杂度:
最好为O(n*logn),最差为O(n**2)
归并排序过程:
拆分:将包含n个元素的序列拆分为n个包含一个元素的序列集:如
[1, 3, 2, 4] --> [ [1], [3], [2], [4] ]
排序和合并:将相邻小序列排序合并为一个序列, 不断迭代这个过程,直到合并为一个序列,排序完成。
[ [1, 3], [2, 4] ] --> [1, 2, 3, 4]
算法实现
快速排序:
def quicks(lst):
m=0
low=0
high=len(lst)-1
if low == high:
return lst
left=[]
right=[]
while low < high:
if lst[m] < lst[low+1]:
low += 1
right.append(lst[low])
else:
low += 1
left.append(lst[low])
lst=left+[lst[m]]+right
return quicks(lst[:len(left)+1]) + quicks(lst[len(left)+1:])
归并排序:
def merges2(lst):
if len(lst) == 1:
return lst
mid = len(lst)//2
left = merges2(lst[:mid])
right = merges2(lst[mid:])
# print(1,left)
# print(2,right)
tmp0 = []
a, b = 0, 0
m, n = len(left), len(right)
while (a != m) and (b != n):
if left[a] < right[b]:
tmp0.append(left[a])
a += 1
else:
tmp0.append(right[b])
b += 1
if a < m:
tmp0 += left[a:]
else:
tmp0 += right[b:]
return tmp0