数据结构-选择排序方法

Data Structures - choosing sorting method

本文关键字:方法 排序 选择 数据结构      更新时间:2023-10-16

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

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

对于预排序数组,最简单的方法应该是类似的方法

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::array

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());

合并两个预排序数组只需要O(N)时间和O(N)额外空间,其中N = n + m。这里CCD_ 5和CCD_。

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

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

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

不使用类,即纯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++];
}