【问题标题】:Recursive insertion sorting not working in python递归插入排序在python中不起作用
【发布时间】:2020-07-16 11:24:10
【问题描述】:
    import sys

首先创建一个函数,并将 arr 和 n 作为参数传递。

    def recursiveinsertionsort(arr,n):

基本情况:当 n=0 或 n=1 时。

        if n<=1:
        return

现在调用序列直到剩下的 n-1 项。

    recursiveinsertionsort(arr,n-1)
    temp=arr[n-1]
    j=n-2
    while j>=0 and arr[j+1] < arr[j]:
        arr[j+1]=arr[j]
        j-=1
    arr[j+1]=temp


    def printArray(arr,n):
        for i in range(n):
            print(arr[i])


    arr=[15,12,26,98,45,3]
    n=len(arr)
    recursiveinsertionsort(arr,n)
    printArray(arr,n)

输出未排序。

【问题讨论】:

  • 插入排序的本质是(a)找到要插入的值在已经排序的东西中的位置,然后(b)插入它。因此,您需要扫描arr[] 以获取第一个值&gt; temp,然后在该点插入——将内容向上移动arr[],这将覆盖您从temp 读取的位置。
  • @ChrisHall 请张贴您想说的语法。会很有帮助。提前致谢
  • 通话后recursiveinsertionsort(arr,n-1) (1) 你有n &gt;= 2; (2) 你知道arr[0] 到(包括)arr[n-2] 是有序的,并且 (3) 下一个要排序的项目是 temp = arr[n-1]——到目前为止一切都很好。所以现在 (a) 从 arr[0] 扫描到 arr[n-2] 以找到 arr[j],第一个值 > temp。然后 (b) temp 属于 arr[j],但是从 arr[j] 到 arr[n-2](包括)的所有内容都需要向上移动到 arr[j+1] 到 arr[n-1](覆盖 arr[n-1],其中 temp读自)。也就是说,您确实需要注意temp &gt; arr[n-2]`的情况。

标签: python-3.x algorithm sorting data-structures recursive-datastructures


【解决方案1】:

在您的 while 循环条件中,将 arr[j+1] &lt; arr[j] 更改为 arr[j] &gt; temp。

正如在 cmets 中提到的,插入排序算法的工作原理是找到 temp 在数组中应该移动到的位置。查看this post 了解有关递归插入排序的更多信息。

【讨论】:

  • 感谢您的链接。它很有帮助。您提出的更改很有用,但是 arr[j+1] temp 的含义与我的语法相同,即 arr[n-2] >arr[n-1]。
  • 当我使用我提议的更改运行您的代码时,排序按预期工作!您仍然收到错误消息吗?
  • 是的,更改后排序工作正常,但我很好奇您提出的控制流和条件语句,我的代码中使用的相同,但它仍然适用于更改后的语句并且给出不正确与原始的输出。你能解释为什么它不能与我的代码一起工作,尽管条件相同?@emarteca
  • 条件不等价。在您的版本中,您基本上是在寻找数组乱序的第一个位置——这不是插入排序算法。使用我的代码,它可以找到当前元素 (temp) 在数组中所属的索引。如果您通过一个使用这两种方法进行排序的示例,您会发现不同之处。
猜你喜欢
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
相关资源
最近更新 更多