快速排序与归并排序的不同点:
- 快速排序是根据pivot,将大范围的数据大体排序,再到最细微的排序
- 归并排序是不断的均分数组,然后先把最细微的数据排序(将数据放入临时空间中组合,放入的同时进行排序)
归并排序中递归的思想和二叉树的后序遍历类似:
也就是先解析分叉的最左边的叶子节点,再解析旁边右侧的叶子节点,然后,解析这两个叶子结点的上一个节点…(具体可以去参考二叉树的后序遍历)
def mergeSort(arrary, left, right):
if left >= right:
return
# 位运算
mid = (left + right) // 2
mergeSort(arrary, left, mid)
mergeSort(arrary, mid + 1, right)
merge(arrary, mid, left, right)
def merge(arrary, mid, left, right):
# 制作空的list:https://blog.csdn.net/qq_41906934/article/details/97972951
temp = [0 for index in range(right - left + 1)]
i, j, k = left, mid + 1, 0
# 如果i和j都没有循环完
# python 满足多个条件不能用 “&” 字符
while (i <= mid and j <= right):
# 想尝试 (三元运算符) 但是 k 和 i j + 1不知道怎么插入
# temp[k] = arrary[i] if arrary[i] <= arrary[j] else arrary[j]
if arrary[i] <= arrary[j]:
temp[k] = arrary[i]
# k += 1
i += 1
else:
temp[k] = arrary[j]
# k += 1
j += 1
k += 1
# 如果多余还剩下i
while (i <= mid):
temp[k] = arrary[i]
k += 1
i += 1
# 如果多余还剩下j
while (j <= right):
temp[k] = arrary[j]
k += 1
j += 1
# 把temp数据放入原本的array中
n = len(temp)
for temp_i in range(n):
arrary[left + temp_i] = temp[temp_i]
# Driver Code
if __name__ == '__main__':
arrary = [12, 11, 13, 5, 6, 7]
print("Given array is", end="\n")
mergeSort(arrary, 0, len(arrary)-1)
print("Sorted array is: ", end="\n")
print(arrary)
引用:
geeksforgeeks