【问题标题】:Merge sort in c++c++中的归并排序
【发布时间】:2020-05-27 19:37:48
【问题描述】:

在竞争性编码中,我遇到了一个编码合并排序的问题 我知道如何用三个参数编写合并排序,即

merge_sort(int arr[],int left,int right)
{
     \\rest of code
}

但问题是

merge_sort(int arr[],int size)
{
     \\rest of code
}

如何对 2 个参数进行归并排序?

【问题讨论】:

  • 你能写一个辅助函数吗?您还可以编写递归 lambda 函数。
  • 这种编码的竞争力如何? bottom up merge sort 会稍微快一些。没有递归,所以不需要辅助函数。

标签: c++ sorting mergesort


【解决方案1】:

你可以调用这个函数

merge_sort(int arr[],int size)
{
     \\rest of code
}

从这个函数

merge_sort(int arr[],int left,int right)
{
     \\rest of code
}

喜欢

merge_sort( arr + left, right - left + 1 );

在这种情况下,相对于第二个函数,参数 left 将等于 0,而参数 right 将等于 right - left + 1,因为将指针移动到数组的所需部分。

所以第一个函数可以通过使用适当的参数和指针算法来替换第二个函数。

或者第二个函数可以像第一个函数一样调用

merge_sort( arr, 0, size - 1 );

【讨论】:

  • Int main 使用 2 个参数(即数组和大小)调用函数。如何仅使用 2 个参数执行合并排序或如何使用 3 个参数(即左右数组)执行合并排序?
  • @Priyank 实际上,在第一次调用中,您的左侧等于 0,右侧等于大小 - 1。
  • @Priyank 正如我使用指针算法编写的那样,第一个函数可以通过将指针设置到所需位置来调用自身。我展示了如何将一个函数的参数转换为另一个函数的参数。
  • 感谢您的帮助
【解决方案2】:

你可以这样做:

merge_sort(int arr[],int size)
{
     merge_sort(arr, 0,size-1) // merge_sort(int arr[],int left,int right)
}

现在你从第 2 个参数调用第 3 个参数函数。

【讨论】:

  • @Priyank 当然。 merge_sort(arr, 0,size-1) 是您的递归 merge_sort 函数,它需要 3 个参数。
  • 太棒了!!一定会尝试
  • @Priyank 我很乐意提供帮助。
【解决方案3】:

int arr[] 看起来像一个数组,但它不是。请记住,数组在传递给函数时会衰减为指向第一个元素的指针。第一种方法使用:

-------------------------------------
|                 |             |
arr(pointer)      left(index)   right(index)

虽然第二个可以做同样的事情:

-------------------------------------
                  |<-- size  -->|
                  arr          

【讨论】:

  • @Priyank 通过递归调用函数。 arr + left 是指向索引 left 处元素的指针
  • @Priyank 一个版本的参数和另一个版本的参数之间存在一对一的关系(正如我试图说明的那样)。如果您知道如何对其中一个进行递归,则可以对另一个进行递归
  • @Priyank 很好,不完全是。您不能从第二个调用第一个,因为它没有指向第一个元素的指针,但反过来应该不是问题
  • 谢谢?我会试试的
猜你喜欢
  • 1970-01-01
  • 2014-04-08
  • 2014-04-21
  • 2017-04-07
  • 2014-01-21
  • 2012-01-03
  • 2012-08-22
  • 1970-01-01
相关资源
最近更新 更多