[英]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.