我在网上找到这个密码:
def merge(left, right):
result = []
i ,j = 0, 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result += left[i:]
result += right[j:]
return result
def mergesort(list):
if len(list) < 2:
return list
middle = len(list) / 2
left = mergesort(list[:middle])
right = mergesort(list[middle:])
return merge(left, right)
当我运行它时,它100%工作。我只是不知道合并排序是如何工作的,也不知道递归函数是如何正确地对左和右进行排序的。
当我陷入难以理解算法工作原理的困境时,我添加调试输出来检查算法内部到底发生了什么。
这里是带有调试输出的代码。试着用递归调用
mergesort
和merge
对输出执行的所有步骤进行uderstand:输出:
合并排序一直是我最喜欢的算法之一。
从短的排序序列开始,然后按顺序将它们合并成更大的排序序列。很简单。
递归部分意味着你是反向工作的——从整个序列开始,对两部分进行排序。每一半也被分割,直到排序变得琐碎,当序列中只有零个或一个元素时。当递归函数返回时,排序的序列会变得更大,正如我在初始描述中所说的。
我相信理解合并排序的关键是理解以下原则——我将其称为合并原则:
如果你手工做几次,你会发现这是正确的。例如:
现在A耗尽了,所以用B中的剩余值扩展C:
合并原则也很容易证明。A的最小值小于A的所有其他值,B的最小值小于B的所有其他值。如果A的最小值小于B的最小值,则它也必须小于B的所有值。因此,它小于A的所有值和B的所有值
因此,只要您继续将满足这些条件的值附加到C中,就可以得到一个排序列表。这就是上面的
merge
函数所做的。现在,根据这个原理,很容易理解一种排序技术,它通过将列表分成更小的列表,对这些列表进行排序,然后将这些排序的列表合并在一起来对列表进行排序。
merge_sort
函数只是一个函数,它将一个列表分成两半,对这两个列表进行排序,然后按照上述方式将这两个列表合并在一起。唯一的问题是,因为它是递归的,所以当它对两个子列表进行排序时,它会将它们传递给自己!如果你很难理解这里的递归,我建议你先研究更简单的问题。但是如果你已经掌握了递归的基本知识,那么你只需要意识到一个单项目列表已经被排序了。合并两个一项列表将生成已排序的两项列表;合并两个两项列表将生成已排序的四项列表;依此类推。
相关问题 更多 >
编程相关推荐