排序算法總結(jié)(二)

歸并排序

歸并排序用的是分而治之的方法。也就是把列表從中間分成兩個(gè)子列表,子列表又各自分為兩個(gè)子列表……這樣直到最后子列表中只有一個(gè)元素為止。然后再依次合并子列表。圖示如下。

排序算法分而治之

合并的過程用到的兩個(gè)子序列都是已經(jīng)排好序的。各自遍歷兩個(gè)子列表的當(dāng)前元素i和j,比較i和j,每次都選出比較小的數(shù),分配到初始新列表的位置,注意要查看如果其中一個(gè)子序列遍歷完了,直接把另外一個(gè)子序列添加到新列表剩余位置即可。

依次填入較小的序列

偽代碼

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)
    #最終返回的是這個(gè)合并了的列表
    return c
def merge_sort(nums):
    #如果最后只剩下一個(gè)元素就返回這個(gè)元素
    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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,301評論 0 52
  • 搞懂基本排序算法 上篇文章寫了關(guān)于 Java 內(nèi)部類的基本知識(shí),感興趣的朋友可以去看一下:搞懂 JAVA 內(nèi)部類;...
    醒著的碼者閱讀 1,315評論 3 4
  • 簡單來說,時(shí)間復(fù)雜度指的是語句執(zhí)行次數(shù),空間復(fù)雜度指的是算法所占的存儲(chǔ)空間 時(shí)間復(fù)雜度計(jì)算時(shí)間復(fù)雜度的方法: 用常...
    Teci閱讀 1,236評論 0 1
  • 1)這本書為什么值得看: Python語言描述,如果學(xué)的Python用這本書學(xué)數(shù)據(jù)結(jié)構(gòu)更合適 2016年出版,內(nèi)容...
    孫懷闊閱讀 12,899評論 0 15
  • 真理其實(shí)都來自于普通生活,仔細(xì)咂摸,活得好的都是哲學(xué)家。當(dāng)然,他或者她自己一般不知道,他們活得挺開心,廢話不多,感...
    seasea閱讀 506評論 0 3

友情鏈接更多精彩內(nèi)容