【问题标题】:Data Structures - choosing sorting method数据结构 - 选择排序方法
【发布时间】:2015-05-20 19:45:48
【问题描述】:

我有 2 个排序数组 A[]、B[]。我的要求是合并这两个排序的数组,结果数组也应该是排序的。由于有 2 个排序数组,我有 2 种方法来解决这个问题。一种是使用我可以排序的 MERGE SORT 方法,另一种我建议的方法是简单地加入这 2 个数组并通过快速排序方法对结果数组进行排序。

我的问题是以上两种方法,哪一种效率更高,运行时间更短,更稳定。请给我建议,如果有其他可用的解决方案,请告诉我。

【问题讨论】:

  • 我认为在空间和时间复杂度方面,快速排序应该比归并排序更快。但是就地合并排序也是可能的。但是,当对数组使用归并排序时,可能需要 O(n) 辅助空间。快速排序的高效实现使用 O(log n) 空间。
  • 所以最好的方法是简单地合并这两个数组,最后使用快速排序对结果数组进行排序,如果错了,请纠正我..
  • @rabishaw 呃...合并两个排序数组不应该是 O(n+m) 吗?同样对于空间复杂性(无论如何,您都必须分配一个新的全尺寸数组)?重新排序附加的数组怎么会比这更快?
  • @rabishaw 注意输入数组已经排序。
  • 由于数组已经排序,您可以使用std::merge

标签: c++ c algorithm sorting data-structures


【解决方案1】:

对于预先排序的数组,最简单的方法应该是这样的

int A[50];
int B[50];
int C[100];

std::merge(std::begin(A), std::end(A), std::begin(B), std::end(B), std::begin(C));

或者如果您使用的是std::arrays

std::array<int, 50> A;
std::array<int, 50> B;
std::array<int, 100> C;

std::merge(A.begin(), A.end(), B.begin(), B.end(), C.begin());

【讨论】:

  • 这行不通,请您写一个清晰的示例代码以便于理解。
  • @xxxxxxxxxx 如果它不起作用,要么您的编译器不支持 c++11,要么您没有传递正确的标志来启用支持。
  • 标志是什么意思?我应该做些什么来运行这段代码,或者我可以复制并粘贴它来执行?你能写完整的代码吗?
  • @xxxxxxxxxx 你用的是什么编译器?
【解决方案2】:

合并两个预排序数组只需要O(N)时间和O(N)额外空间N = n + m。这里nm 是每个数组中的元素数。

在上述情况下,如果两个数组最初是未排序的,则必须分别在O(nlogn)O(mlogm) 时间对它们进行排序。然后合并它们需要另一个O(N) 时间,从而渐近地产生总O(max(m, n) log max(m, n)) 时间。

另一方面,如果您加入两个数组并应用任何第一个排序算法,如快速排序(C++ 的sort(..)),时间复杂度将为O(NlogN)O(N) 额外空间。

所以就时间复杂度而言,我认为您应该使用合并排序的合并方法,因为您的两个数组最初是排序的。

【讨论】:

    【解决方案3】:

    不使用类,即纯 C:

    void merge(int A[], int B[], int C[])
    {
        int a, b, c;
        a= b= c= 0;
    
        while (a<50 && b<50) {
            if (A[a] < B[b])
                 C[c++]= A[a++];
            else C[c++]= B[b++];
        }
        while (a<50) C[c++]= A[a++];
        while (b<50) C[c++]= B[b++];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      相关资源
      最近更新 更多