簡體   English   中英

在 Python 中實現歸並排序

[英]Implementing Merge Sort in Python

我正在嘗試在 Python 中實現簡單的合並排序算法。

arr=[1,3,5,2,4,6]
n=6
l=0
h=n-1

def merge_Sort(l,h):
    if(l==h):
        return arr[l]

    m=(h+l)//2
    arr1=merge_Sort(l,m)
    arr2=merge_Sort(m+1,h)

    s1=m-l
    s2=h-(m+1)
    mer=[]
    k1=k2=0

    while(k1<=s1 or k2<=s2):
        if(arr1[k1] < arr2[k2]):
            mer.append(arr1[k1])
            k1+=1
        else:
            mer.append(arr2[k2])
            k2+=1

    if(k1>s1):
        while(k2<=s2):
            mer.append(arr2[k2])
            k2+=1

    if(k2>s2):
        while(k1<=s1):
            mer.append(arr1[k1])
            k1+=1    

    return mer

res=merge_Sort(l,h)

print(res)

但是在運行上述代碼時我收到此錯誤消息:

類型錯誤:“int”對象不可下標

任何人都可以向我解釋為什么我會收到此錯誤?

問題在這里:

    if(l==h):
        return arr[l]
    ...
    while(k1<=s1 or k2<=s2):

請改用此代碼:

    if(l==h):
        return arr[l:l+1]
    ...
    while(k1<=s1 and k2<=s2):

旁注,這段代碼:

    if(k1>s1):
        while(k2<=s2):
            mer.append(arr2[k2])
            k2+=1

    if(k2>s2):
        while(k1<=s1):
            mer.append(arr1[k1])
            k1+=1

可以簡化為:

    mer.extend(arr1[k1:s1+1])
    mer.extend(arr2[k2:s2+1])

改變這個:

    if(l==h):
        return arr[l]

進入:

    if(l==h):
        return [arr[l]]

和這個:

    while(k1<=s1 or k2<=s2):

進入:

    while(k1<=s1 and k2<=s2):

我測試了它,它工作正常。

TypeError: 'int' object is not subscriptable意味着您正在嘗試在int上迭代(或使用類似a[0]東西)。

在“崩潰線”之前添加它。

print(arr1, arr2)

輸出: 1 3

所以你在做3[k2]

另一種方法是:

def merge_sort(a):

if len(a) <= 1:
    return a
mid = len(a) // 2
left = merge_sort(a[:mid])
right = merge_sort(a[mid:])
return merge(left, right)

定義合並(左,右):

if not left:
    return right
if not right:
    return left
if left[0] < right[0]:
    return [left[0]] + merge(left[1:], right)
return [right[0]] + merge(left, right[1:])

這將是一個相對標准的方法:

def merge(left, right):
    res = []

    while len(left) > 0 and len(right) > 0:
        if left[0] <= right[0]:
            res.append(left[0])
            left.pop(0)
        else:
            res.append(right[0])
            right.pop(0)

    while len(left) > 0:
        res.append(left[0])
        left.pop(0)
    while len(right) > 0:
        res.append(right[0])
        right.pop(0)

    return res


def merge_sort(lst):
    if len(lst) <= 1:
        return lst

    left = lst[:(len(lst)//2)]
    right = lst[(len(lst)//2):]

    left = merge_sort(left)
    right = merge_sort(right)

    return merge(left,right)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM