如何对一个大数组进行排序由四个排序部分组成,最好是通过合并排序算法?

时间:2015-11-25 17:00:07

标签: c++ sorting

我在一个大数组中有4个排序部分。例如,大数组有100个项目,排序部分在索引上:0-24,25-49,50-74,75-99。

对整个阵列进行排序的最佳方法是什么?我真的更喜欢合并排序算法。

非常感谢您的一些想法。

3 个答案:

答案 0 :(得分:3)

您不需要进行合并排序。您只需要进行3次合并操作(第1部分合并第2部分;第3部分合并第4部分;然后合并这两部分)。请注意,merge是一个O(n)操作,这使得合并排序工作。所以这个算法将是O(n)+ O(n)+ O(n)= O(n)。

O(n)是最佳的,因为无论如何,您都需要至少访问每个元素一次。 (所以问题,这个算法,也是Omega(n)和Theta(n),因为它的价值。)

答案 1 :(得分:2)

您需要使用std::inplace_merge

include

答案 2 :(得分:0)

您可以使用常规的自下而上合并,但由于您有4个已排序的组,每个有25个元素,因此将自下而上的合并排序运行大小(宽度)初始化为25.​​您可以按照wiki示例中的代码进行操作,但使用除外每次传递后std :: swap(A,B)而不是复制回传。由于100是n的倍数,因此您不需要最小化检查。

http://en.wikipedia.org/wiki/Merge_sort#Bottom-up_implementation

这样的事情:

#define n 100
// array A[] has the items to sort; array B[] is a work array
// in this case data ends up back in A[]
void BottomUpMergeSort(int A[], int B[], int n)
{
    for (int width = 25; width < n; width = 2 * width){
        for (int i = 0; i < n; i = i + 2 * width)
            BottomUpMerge(A, i, i+width, i+2*width, B);
        std::swap(A, B);
    }
}

void BottomUpMerge(int A[], int iLeft, int iRight, int iEnd, int B[])
{
    int i0 = iLeft;
    int i1 = iRight;
    int j;
    for (j = iLeft; j < iEnd; j++){
        if (i0 < iRight && (i1 >= iEnd || A[i0] <= A[i1]))
          B[j] = A[i0++];
        else
          B[j] = A[i1++];
    }
}