Merge Sort on Python:获得不寻常的结果模式

时间:2016-07-13 16:25:44

标签: python python-2.7 mergesort

我有一个从0到9,999的10,000个整数的未排序数组。我想在这个未排序的数组上应用合并排序,我写了下面的代码 -

import sys
def merge_sort(data):
    result = []
    if len(data) <= 1:
        return data
    else:
        mid = int(len(data)/2)
        left = data[:mid]
        right = data[mid:]
        sorted_left = merge_sort(left)
        sorted_right = merge_sort(right)
        i = j = k = 0
        total_len = len(sorted_left) + len(sorted_right)
        for k in range(0, total_len):
            if i < len(sorted_left) and j < len(sorted_right):
                if sorted_left[i] < sorted_right[j]:
                    result.append(sorted_left[i])
                    i = i+1
                    k = k+1
                elif sorted_left[i] > sorted_right[j]:
                    result.append(sorted_right[j])
                    j = j+1
                    k = k+1
            elif i < len(sorted_left):
                result.append(sorted_left[i])
                i = i+1
                k = k+1
            elif j < len(sorted_right):
                result.append(sorted_right[j])
                j = j+1
                k = k+1
            else:
                sys.exit("There is some issue with the code")
        return result
print merge_sort(data)

因此,当我对这些数据进行排序时,除了一些条目外,我得到了正确的排序顺序。例如 - 最后我得到了这样的结果 -

[...'9989','999','9990','9991','9992','9993','9994','9995','9996','9997','9998' ,'9999']

正如您所看到的,数字'999'位置错误。不只是在这个片段中,它发生在其他地方,就像'995'出现在'9949'和'9950'之间。所以有人知道为什么会这样吗? P.S.-我运行此代码进行调试,它运行时没有错误产生这些结果

3 个答案:

答案 0 :(得分:1)

您正在订购字符串:'9989' < '999' < '9990'。如果要订购整数,则必须将输入列表转换为整数。

答案 1 :(得分:0)

您的数据是以字符串还是整数形式出现的?根据您的示例输出,它们是字符串。

在这种情况下,'1'就在'10'之前。如果你期望整数,那么你可以转换为int来进行排序。

答案 2 :(得分:0)

您的data是字符串,而不是数字。要转换为整数,请使用:

data = [int(x) for x in data]

Python会&#34;比较&#34;各种各样的物品。例如:

>>> "a" < "ab"
True
>>> None < "a"
True
>>> 1 < "a"
True

如果比较这些项目,python将不会反对。

python中的比较

对于整数和字符串,python有内置的比较方法。对于您创建的对象,您可以定义自己的比较方法。您可以为python将用于比较的对象定义的方法include

object.__lt__(self, other)
object.__le__(self, other)
object.__eq__(self, other)
object.__ne__(self, other)
object.__gt__(self, other)
object.__ge__(self, other)

通过为对象定义自己的方法,可以提供很大的灵活性。