在Python中找出mergesort的中间点

时间:2017-01-31 14:41:40

标签: algorithm python-3.x sorting

我已经写了两个不同的mergesort算法实现,只有一个区别,就是用于找到数组中间点来划分它的公式。

首次实施:(正确运行)

def mergesort(arr):
    start = 0
    end = len(arr) - 1
    if len(arr) > 1:
        mid = int(len(arr)/2)
        left = mergesort(arr[:mid])
        right = mergesort(arr[mid:])
        return merge(left,right)
    else:
        return arr

def merge(left,right):
    final = []
    while len(left) > 0 or len(right) > 0:
        if len(left) > 0 and len(right) > 0:
            if left[0] < right[0]:
                final.append(left[0])
                del left[0]
            elif right[0] < left[0]:
                final.append(right[0])
                del right[0]
        elif len(right) > 0:
            final.extend(right)
            right = []
        elif len(left) > 0:
            final.extend(left)
            left = []
    return final


arr = list(map(int,input().split(' ')))
print ("List before sorting:",arr)
final = mergesort(arr)
print ("After sorting:",final)

第二个实现(进入无限循环):

def mergesort(arr):
    start = 0
    end = len(arr) - 1
    if len(arr) > 1:
        mid = int(start + (end - start)/2)
        left = mergesort(arr[:mid])
        right = mergesort(arr[mid:])
        return merge(left,right)
    else:
        return arr

def merge(left,right):
    final = []
    while len(left) > 0 or len(right) > 0:
        if len(left) > 0 and len(right) > 0:
            if left[0] < right[0]:
                final.append(left[0])
                del left[0]
            elif right[0] < left[0]:
                final.append(right[0])
                del right[0]
        elif len(right) > 0:
            final.extend(right)
            right = []
        elif len(left) > 0:
            final.extend(left)
            left = []
    return final


arr = list(map(int,input().split(' ')))
print ("List before sorting:",arr)
final = mergesort(arr)
print ("After sorting:",final)

我已经看到了快速排序算法中使用的第二个公式。问题是我的目标是分割数组(如快速排序的情况)为什么它会进入无限循环。

我非常困惑,无法得出任何合理的结论。

有人可以对此事提出一些看法吗?非常感谢。

1 个答案:

答案 0 :(得分:0)

使用单个数组而不是子数组的多个实例时,应使用第二种方法。原始数组不是使用实际的单独子数组,而是通过索引范围拆分为逻辑子数组。 mergesort函数将采用3个参数,mergesort(arr,start,end),调用者将调用mergesort(arr,0,len(arr))。合并函数将采用4个参数,合并(arr,start,mid,end)。

使用带有一个参数mergesort(arr)的入口函数可以提高效率。它将分配一个工作数组tmp并将其传递给内部函数,来自mergesort(arr)的调用将是mergesort(arr,tmp,0,len(arr))。 mergesort函数将是mergesort(arr,tmp,start,end)。合并函数将合并(arr,tmp,start,mid,end)。