繁体   English   中英

合并Python中的排序实现

[英]Merge Sort Implementation in Python

def merge_sort(arr):
    arr1 = []
    arr2 = []
    mid = int(len(arr)/2)
    if len(arr) == 1:
        return arr
    elif len(arr) > 2:
        arr1 = arr[0:mid]
        arr2 = arr[mid:len(arr)]
        return [merge_sort(arr1), merge_sort(arr2)]
    elif len(arr) == 2:
        if arr[0]>arr[1]:
            temp = arr[0]
            arr[0] = arr[1]
            arr[1] = temp
        return arr

我编写了此函数,该函数将列表递归地分成两部分,直到其长度至少为1或2。

如果列表的长度变为:

  1. 如果列表的长度变为
  2. list的元素被交换,以便它们以升序排列并返回列表。

问题在于,运行此代码后,输出将以列表列表的形式出现,并且将它们合并似乎是一项工作。

该代码为给定的调用生成以下输出:

merge_sort([5,4,1,8,7,2,6,3,9])

输出:

[[[4, 5], [1, 8]], [[2, 7], [[6], [3, 9]]]]

在“ 合并排序算法”中,您必须具有merge功能,以便在合并的每个步骤中对两个小部分进行排序。 问题是,当数组大小为2时,您只是交换两个数字。

def merge(arr1,arr2):
    it1 = 0
    it2 = 0
    ret = []
    while it1 < len(arr1) or it2 < len(arr2):
        if it1 == len(arr1):
            ret.append(arr2[it2])
            it2+=1
        elif it2 == len(arr2):
            ret.append(arr1[it1])
            it1+=1
        else:
            if arr1[it1] > arr2[it2]:
                ret.append(arr2[it2])
                it2+=1
            else:
                ret.append(arr1[it1])
                it1+=1
    return ret



def merge_sort(arr):
    arr1 = []
    arr2 = []
    mid = int(len(arr)/2)
    if len(arr) == 1:
        return arr
    elif len(arr) > 2:
        arr1 = arr[0:mid]
        arr2 = arr[mid:len(arr)]
        return merge(merge_sort(arr1), merge_sort(arr2))
    elif len(arr) == 2:
        if arr[0]>arr[1]:
            temp = arr[0]
            arr[0] = arr[1]
            arr[1] = temp
    return arr

PS。 我只是对您的代码进行了一些小的更改。 您可以更好,更整齐地编写合并排序算法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM