我有一个从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.-我运行此代码进行调试,它运行时没有错误产生这些结果
答案 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将用于比较的对象定义的方法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)
通过为对象定义自己的方法,可以提供很大的灵活性。