排序算法总结(二)

归并排序

归并排序用的是分而治之的方法。也就是把列表从中间分成两个子列表,子列表又各自分为两个子列表……这样直到最后子列表中只有一个元素为止。然后再依次合并子列表。图示如下。

排序算法分而治之

合并的过程用到的两个子序列都是已经排好序的。各自遍历两个子列表的当前元素i和j,比较i和j,每次都选出比较小的数,分配到初始新列表的位置,注意要查看如果其中一个子序列遍历完了,直接把另外一个子序列添加到新列表剩余位置即可。

依次填入较小的序列

伪代码

merge_sort(nums)
    if low>=high
        return
    middle=(low+high)//2
    merge_sort(low, middle)
    merge_sort(middle, high)
    merge(nums, low, middle,high)

merge()
for i from low to high
    tmp[i]=nums[i]
    i=low
    j=middle+1
    k=low
    while i<=middle and j<=high:
        if tmp[i]<=tmp[j]:
            nums[k]=tmp[i]
            k++
            i++
        if tmp[i]>tmp[j]:
            nums[k]=tmp[j]
            k++
            j++
    while i<middle:
        nums[k]=tmp[i]
            k++
            i++
    while j<high:
        nums[k]=tmp[j]
            k++
            j++
end

代码如下:

def merge(a, b):
    c=[]
    i=j=0
    while i<len(a) and j<len(b):
        if a[i]<b[j]:
            c.append(a[i])
            i+=1
        else:
            c.append(b[j])
            j+=1
    if j==len(b):
        for g in a[i:]:         
            c.append(g)

    else:
        for g in b[j:]:         
            c.append(g)
    #最终返回的是这个合并了的列表
    return c
def merge_sort(nums):
    #如果最后只剩下一个元素就返回这个元素
    if len(nums)<=1:
        return nums
    middle=len(nums)/2
    left=nums[:middle]
    right=nums[middle:]
    left=merge_sort(left)
    right=merge_sort(right)
    return merge(left, right)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,220评论 0 52
  • 搞懂基本排序算法 上篇文章写了关于 Java 内部类的基本知识,感兴趣的朋友可以去看一下:搞懂 JAVA 内部类;...
    醒着的码者阅读 1,216评论 3 4
  • 简单来说,时间复杂度指的是语句执行次数,空间复杂度指的是算法所占的存储空间 时间复杂度计算时间复杂度的方法: 用常...
    Teci阅读 1,130评论 0 1
  • 1)这本书为什么值得看: Python语言描述,如果学的Python用这本书学数据结构更合适 2016年出版,内容...
    孙怀阔阅读 12,597评论 0 15
  • 真理其实都来自于普通生活,仔细咂摸,活得好的都是哲学家。当然,他或者她自己一般不知道,他们活得挺开心,废话不多,感...
    seasea阅读 436评论 0 3