排序和搜索(八)——归并排序的python实现

【基本原理】

归并排序是一种递归算法,不断将列表拆分为一半。 如果列表为空或有一个项,则按进行排序。如果列表有多个项,我们分割列表,并递归调用两个半部分的合并排序。 一旦对这两半排序完成,就执行称为合并的基本操作。合并是获取两个较小的排序列表并将它们组合成单个排序的新列表的过程。

【分析】

一分为二的过程:类似于二分查找,时间复杂度为O(logn)

合并过程:大小为 n 的列表的合并操作需要 n 个操作。

归并排序是一种 O(nlogn) 算法。

【代码】

 
 
#合并排序,递归将列表一分为二,直至不可再分;从下到上,比较,合并
def mergeSort(alist):
    print('当前列表为',alist)
    if len(alist)>1:
        #取中间值
        mid=len(alist)//2
        #中间值的左半边,mid处取不到
        lefhalf=alist[:mid]
        # 中间值的右半边
        righthalf=alist[mid:]
        #递归调用
        mergeSort(lefhalf)
        mergeSort(righthalf)

        #设置左半边、右半边以及整个列表的索引
        i=0
        j=0
        k=0
        while i<len(lefhalf) and j<len(righthalf):
            #判断:左边小于右边,就把左边的值付给alist[0],同时左边索引i+1;
            # 反过来,右边的值付给alist[0],同时右边索引j+1;循环直至有一边不满足条件;
            if lefhalf[i]<righthalf[j]:
                alist[k]=lefhalf[i]
                i=i+1
            else:
                alist[k]=righthalf[j]
                j=j+1
            k=k+1
        #上面循环跳出条件是有一边遍历列表结束;此时还有一边没结束,同时alist列表还缺部分数据
        while i<len(lefhalf):
            #接着上面的k、i赋值,i之前的值都已经赋给alist了
            alist[k]=lefhalf[i]
            i=i+1
            k=k+1
        while j<len(righthalf):
            alist[k] = righthalf[j]
            j=j+1
            k=k+1
        print('正在合并',alist)
alist = [54,26,93,17,77,31,44,55,20]
mergeSort(alist)
print(alist)


【结果】



猜你喜欢

转载自blog.csdn.net/brave_jcc/article/details/79559624