一、归并排序
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
二、归并排序算法步骤
归并算法步骤
- 将一个序列从中间位置分成两个序列;
- 在将这两个子序列按照第一步继续二分下去;
- 直到所有子序列的长度都为1,也就是不可以再二分截止。
- 这时候再两两合并成一个有序序列即可。
如图:
所谓归并,实际就是先递归将序列分解成单一元素序列再用合并排序生成新的有序序列。
分解序列
- 比较简单,从序列中间分解,递归就可以了,不再单独介绍。
合并排序
- 需要一个空序列用于存放排序后的序列
- 输入的两个顺序序列。
- 三个索引用于定位操作的元素
具体实现原理如下:
- 蓝色索引和黑色索引进行比较
- 将较小的数值填入新序列的绿色索引处,同时将相应的索引后移
- 重复运行1、2,直到有一个索引大于序列长度,将另一个序列索引后面的序列拼接到新序列
归并排序实际运行中递归和合并排序是交织再一起的,具体流程可以参考代码部分。
归并排序Python实现
先上序列,生成随机序列:
import random
def ord_list(n):
ord = list(range(n))
return ord
def ran_list(n):
ran = ord_list(n)
random.shuffle(ran)
return ran
排序代码:
def mergeSort(list):
#递归终止条件:元素只有一个或者为空
if len(list)<2:
return list
mid=len(list)//2
left,right=list[0:mid],list[mid:]
return merge(mergeSort(left),mergeSort(right)) #在这里实现递归 和合并排序,记住每一个mergeSort内都包含merge
def merge(left,right):
new_list=[]
l_index, r_index= 0, 0,
while left and right:
if l_index>=len(left):#左侧序列没有数据了
new_list+=right[r_index:]
return new_list
elif r_index>=len(right):#右侧序列没有数据了
new_list+=left[l_index:]
return new_list
if left[l_index]<right[r_index]:#比较两个序列指针值,选出较小的值
new_list.append(left[l_index])
l_index+=1
else:
new_list.append(right[r_index])
r_index += 1
归并排序的代码运行流程,如下图红线运行路线,如果不明白可以结合下图慢慢体会
看看效果:
if __name__=='__main__':
test_list =ran_list(10)
print(test_list)
final_list=mergeSort(test_list)
print(final_list)
'''
输出如下:
[1, 9, 8, 5, 4, 7, 0, 6, 3, 2]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
'''
总结
归并算法的学习需要一点点耐心,如果还是不明白,可以对照代码和流程图反复研究。