使用不同的方法在Python中合并排序实现

时间:2017-09-09 15:36:03

标签: python sorting mergesort

我已经看到了很多合并排序的实现,但是,我试图编写一个从合并排序的算法定义中逐字翻译的实现:

  • 拆分阵列,直到你剩下1个元素
  • 将它们合并在一起。

但是我有点卡住了。这是我的代码,直到现在,

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])

有人可以帮助我将这两种方法拼接在一起以获得合并排序。只是重申我不是在寻找一种新的方法。感谢。

1 个答案:

答案 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]