以下是合并排序的代码..代码运行良好并对数字进行排序。但是,如果我们要更大的数据必须进行排序,那么就会出现问题。要排序的数据包含不重复的数字。但是在排序之后,有一些数字会重复多次。我不明白为什么会这样......当我给出100000个数字的数据集时会发生这种情况。当要对较小的数据进行排序时,代码运行良好。
def mergeSort(alist):
if len(alist)>1:
mid = len(alist)/2
lefthalf = alist[:mid]
righthalf = alist[mid:]
mergeSort(lefthalf)
mergeSort(righthalf)
i=0
j=0
k=0
while i<len(lefthalf) and j<len(righthalf):
if lefthalf[i]<righthalf[j]:
alist[k]=lefthalf[i]
i=i+1
else:
alist[k]=righthalf[j]
j=j+1
k=k+1
while i<len(lefthalf):
alist[k]=lefthalf[i]
i=i+1
k=k+1
while j<len(righthalf):
alist[k]=righthalf[j]
j=j+1
k=k+1
print("select the file: ")
file_name = tkFileDialog.askopenfile(mode='r', title='Select word list file')
inv_data = np.loadtxt(file_name,dtype='float', comments='#', delimiter=None, converters=None, skiprows=0, usecols=None,
unpack=False, ndmin=0)
mergeSort(inv_data)
print("sorted list :", inv_data)
数据集位于以下链接http://spark-public.s3.amazonaws.com/algo1/programming_prob/IntegerArray.txt
中答案 0 :(得分:5)
我猜你在发现代码工作得很好的时候用Python列表进行了测试。现在你使用NumPy数组。关键的区别在于切割NumPy数组,如此处
lefthalf = alist[:mid]
righthalf = alist[mid:]
创建原始数组的视图,而切片列表则创建副本。
当您的算法通过合并alist
和lefthalf
覆盖righthalf
时,所有三个列表必须分开;否则它可能会覆盖尚未合并的项目lefthalf
。
该错误可以由一个小数组触发:
>>> l = np.arange(10,0,-1)
>>> l
array([10, 9, 8, 7, 6, 5, 4, 3, 2, 1])
>>> mergeSort(l)
>>> l
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])