我已经看到了很多合并排序的实现,但是,我试图编写一个从合并排序的算法定义中逐字翻译的实现:
但是我有点卡住了。这是我的代码,直到现在,
class MergeSort:
def __init__(self):
bucket = []
def _sort(self, arr):
if len(arr) == 1:
pass
mid = len(arr) //2
self._sort(arr[:mid])
self._sort(arr[mid:])
def _merge(self, arr1, arr2, arr):
i, j = 0, 0
while i < len(arr1) and j < len(arr2):
if arr1[i] < arr2[j]:
arr.append(arr1[i])
i += 1
else:
arr.append(arr2[j])
j += 1
将以这种方式调用代码。
merge_sort = MergeSort()
merge_sort._sort([1,9,3,2,5])
有人可以帮助我将这两种方法拼接在一起以获得合并排序。只是重申我不是在寻找一种新的方法。感谢。
答案 0 :(得分:1)
我不是100%清楚为什么你需要将你的逻辑封装在一个类中(这个决定导致了一个问题的兔子漏洞:类设计的Python习语等等)。但是,下面的代码在Python中实现了由算法定义的合并排序:
class MergeSort:
def _sort(self, arr):
arr1 = []
arr2 = []
n = len(arr)
if n <= 1:
return
for i in range(0, n):
if i < (n / 2):
arr1.append(arr[i])
else:
arr2.append(arr[i])
self._sort(arr1)
self._sort(arr2)
self._merge(arr, arr1, arr2)
return arr
def _merge(self, arr, arr1, arr2):
end1 = len(arr1)
end2 = len(arr2)
start1 = 0
start2 = 0
k = 0
while (start1 < end1) and (start2 < end2):
if arr1[start1] < arr2[start2]:
arr[k] = arr1[start1]
start1 += 1
else:
arr[k] = arr2[start2]
start2 += 1
k += 1
while start1 < end1:
arr[k] = arr1[start1]
start1 += 1
k += 1
while start2 < end2:
arr[k] = arr2[start2]
start2 += 1
k += 1
哪个收益率:
>>>lis = [4,1,6,2,3,8,9,7]
>>>print "Sorted array: ", MergeSort()._sort(lis)
Sorted array: [1, 2, 3, 4, 6, 7, 8, 9]