簡體   English   中英

使用其他方法合並Python中的排序實現

[英]Merge sort implementation in Python using a different approach

我見過許多實現合並排序的實現,但是,我正在嘗試編寫一種可以從合並排序的算法定義中進行字面翻譯的實現:

  • 分割數組,直到剩下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])

有人可以幫我將這兩種方法縫合在一起,以某種方式獲得合並排序。 重申一下,我不是在尋找一種新方法。 謝謝。

我不是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]

暫無
暫無

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

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