【问题标题】:C++ Recursive Sorting by Divide and Conquer & Iterative sorting通过分而治之的C ++递归排序和迭代排序
【发布时间】:2013-11-25 03:42:37
【问题描述】:

能否请你们用外行的话向我解释一下,无论有没有代码示例,使用递归的分而治之数组排序是如何工作的,以及它与迭代数组排序有何不同?我完全迷失在这里。

【问题讨论】:

  • 什么意思?分而治之的工作方式总是相同的:分成两个(或更多)子问题,递归解决子问题,最后加入解决方案。您可以通过多种方式执行此操作:对前半部分数组进行排序,然后对后半部分进行排序,然后合并两个排序后的数组(合并排序方法)。或者在数组中取一个数字,将所有小于该数字的元素放在一个子数组中,将较大的元素放在另一个子数组中。对这两个子数组进行排序并将它们连接起来。 (快速排序方法)。不知道您对迭代排序有什么要求。在那种情况下,“迭代”是什么意思?
  • 这是给我的提示。不过,我没有太多关于如何完成它的背景知识。我有点不知所措......你要设计和实现三个函数,其中两个将使用递归。第一个是排序函数,当给定数组和大小时,它将对数组进行排序。该函数将使用递归来使用分治法对数组进行排序。第二个是一个搜索函数,它也使用递归并在数组上实现二进制搜索。最后一个函数将迭代地对数组进行排序(不使用递归)。

标签: c++ arrays sorting recursion iteration


【解决方案1】:

有几种迭代数组排序算法,所有这些算法都涉及比较元素并根据需要移动它们以使数组排序。

进行递归解决方案的一种方法是有一个基本情况,如果数组非常小,则使用迭代排序,对于较大的数组,它将数组拆分为较小的块并递归。这些块中的每一个都将返回排序后,然后将它们合并(合并排序的数组很快)。

所以在伪代码中:

function recursive_sort(array) {
    if (array is small)
        sort array iteratively and return
    else
        // split the array
        let array1 be the first half of array
        let array2 be the second half of array
        // sort the chunks
        recursive_sort(array1)
        recursive_sort(array2)
        // merge() describes the operation of merging two sorted arrays (fast!)
        array = merge(array1, array2)
}

请注意,递归排序的基本情况可能只是 array 为空或只有 1 个元素。在这种情况下,基本情况不需要做任何事情,因此不依赖于迭代排序方法。

当然还有其他递归算法可以使用,但基本思想是一样的:每次递归调用都会使用原始数组的一些较小的块,最后将这些块组合起来给出排序结果。

【讨论】:

    猜你喜欢
    • 2013-07-02
    • 2018-02-09
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    相关资源
    最近更新 更多