【问题标题】:I have to sort an array using insertion sort and using recursion (without loops)我必须使用插入排序和递归(没有循环)对数组进行排序
【发布时间】:2022-01-17 01:43:47
【问题描述】:

我必须使用插入排序和使用递归而不使用循环对数组进行排序。我已经尝试过,但它没有对任何东西进行排序。这是我的代码:

def recursiveInsertionSort(array, i, j):
    n = len(array)
    if i < n:
        temp = array[i]
        j = i - 1
        if j >= 0 and array[j] > temp:
            array[j + 1] = array[j]
            recursiveInsertionSort(array, i, j - 1)
        array[j + 1] = temp
        recursiveInsertionSort(array, i + 1, j)
    return array

arr = [10, 8, 7, 50, 60, 3, 9, -1]
print(recursiveInsertionSort(arr, 1, 0))

输出是 [10, 8, 7, 50, 60, 3, 9, -1] 与给定数组相同。预期输出为 [-1, 3, 7, 8, 9, 10, 50, 60] 谁能帮我找出问题所在?

【问题讨论】:

  • 编辑了帖子。
  • 你的代码很可疑——你传递了一个参数 j,但它从未被使用过(你立即用j = i - 1 覆盖它的值)
  • 您能解释一下您的代码背后的逻辑吗?目前,您正在向我们展示一个不起作用的代码,并且您希望我们了解它应该做什么以及如何修复它以使其正确运行。由于它实际上并没有做你想做的事情,我们无法猜测你想要做什么。请添加英文句子来解释 i 和 j 是什么,逻辑是什么,以及这应该如何实现插入排序(例如,实际插入发生在哪里?)

标签: python sorting recursion


【解决方案1】:

老实说,您的代码中有太多错误,我无法一一列举,但这是可行的:

def recursiveInsertionSort(array, i, j):
    n = len(array)
    if i < n and j >= 0:
        if array[j] > array[j + 1]:
            temp = array[j + 1]
            array[j + 1] = array[j]
            array[j] = temp
        recursiveInsertionSort(array, i, j - 1)
    if j == 0:
        recursiveInsertionSort(array, i + 1, i)
    return array

arr = [10, 8, 7, 50, 60, 3, 9, -1]
print(recursiveInsertionSort(arr, 1, 0))

输出:

[-1, 3, 7, 8, 9, 10, 50, 60]

【讨论】:

    【解决方案2】:

    递归是一种函数式遗产,因此将其与函数式风格一起使用会产生最佳效果。这意味着要避免诸如突变、变量重新分配和其他副作用之类的事情。

    我们可以使用inductive reasoninginsertion_sort(t)。从输入源src = t 和一个空的目标数组dst = [] 开始-

    1. 如果src 为空,则没有可排序的内容。返回dst数组
    2. (感应)src 至少有一个元素。 insert 第一个元素 src[0] 进入 dst 并在子问题 src[1:] 上重复出现
    def insertion_sort(t):
      def run(src, dst):
        if not src:
          return dst                                # 1
        else:
          return run(src[1:], insert(dst, src[0]))  # 2
      return run(t, [])
    

    insert(t, x) 可以使用相同的技术编写 -

    1. 如果输入t 为空,则唯一可能的输出是[x]
    2. (感应)t 至少有一个元素。如果第一个元素 t[0] 小于要插入的元素 x,则在递归子问题 insert(t[1:], x) 的结果前面加上 t[0]
    3. (感性)t 第一个元素大于或等于x。将 x 添加到 t
    def insert(t, x):
      if not t:
        return [x]                        # 1
      elif t[0] < x:
        return [t[0]] + insert(t[1:], x)  # 2
      else:
        return [x] + t                    # 3
    

    最后打印结果

    arr = [10, 8, 7, 50, 60, 3, 9, -1]
    print(insertion_sort(arr))
    
    [-1, 3, 7, 8, 9, 10, 50, 60]
    

    可视化

    写出评估步骤有助于我们可视化递归计算的增长方式。首先我们看一下两者中比较简单的insert(t,x)

    insert([3, 7, 8, 10, 50, 60], 9)
    == [3] + insert([7, 8, 10, 50, 60], 9)
    == [3] + [7] + insert([8, 10, 50, 60], 9)
    == [3] + [7] + [8] + insert([10, 50, 60], 9)
    == [3] + [7] + [8] + [9] + [10, 50, 60]
    == [3, 7] + [8] + [9] + [10, 50, 60]
    == [3, 7, 8] + [9] + [10, 50, 60]
    == [3, 7, 8, 9] + [10, 50, 60]
    == [3, 7, 8, 9, 10, 50, 60]
    

    现在让我们可视化insertion_sort(t) -

    insertion_sort([10, 8, 7, 50, 60, 3, 9, -1])
    == run([10, 8, 7, 50, 60, 3, 9, -1], [])
    == run([8, 7, 50, 60, 3, 9, -1], [10])
    == run([7, 50, 60, 3, 9, -1], [8, 10])
    == run([50, 60, 3, 9, -1], [7, 8, 10])
    == run([60, 3, 9, -1], [7, 8, 10, 50])
    == run([3, 9, -1], [7, 8, 10, 50, 60])
    == run([9, -1], [3, 7, 8, 10, 50, 60])
    == run([-1], [3, 7, 8, 9, 10, 50, 60])
    == run([], [-1, 3, 7, 8, 9, 10, 50, 60])
    == [-1, 3, 7, 8, 9, 10, 50, 60]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-05
      • 2021-09-06
      • 2021-06-22
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      相关资源
      最近更新 更多