0

私はこのマージソート方法にこだわっています。私は再帰的にやろうとはしていませんが、これをうまく機能させることはできません。それを機能させるために行う必要がある小さな変更があると思います。助言がありますか?

  protected static void merge(long[] a, long[] workSpace, int lowPtr, int highPtr, int upperBound) {
    int j = 0;                             // workspace index
    int lowerBound = lowPtr;
    int mid = highPtr-1;
    int n = upperBound-lowerBound+1;       // # of items

    while(lowPtr <= mid && highPtr <= upperBound)
        if(a[lowPtr] < a[highPtr] )
            workSpace[j++] = a[lowPtr++];
        else
            workSpace[j++] = a[highPtr++];

    while(lowPtr <= mid)
        workSpace[j++] = a[lowPtr++];

    while(highPtr <= upperBound)
        workSpace[j++] = a[highPtr++];

    for(j=0; j<n; j++)
        a[lowerBound+j] = workSpace[j];
4

1 に答える 1

0

このルーチンを外部でどのように使用するかに関係していると思われます。5分ほど見てもエラーが出なかったので試してみたところ問題なく動作しているようです。

C++ を知る必要はありません (これは、たまたまこのマシン用の便利なコンパイラを持っているためです)。

int main() {
    long a[10] = {1,2,3,4,15,5,11,12,13,14}; // two sorted halves to merge
    long * temp = new long[10];
    for (int i = 0; i < 10; i++)
    {
        cout << a[i] << ","; // printout before merge
    }
    cout << endl;
    merge(a, temp, 0, 5, 9); // 0-4 and 5-9
    for (int i = 0; i < 10; i++)
    {
        cout << a[i] << ","; // printout after merge
    }
}

出力:

1,2,3,4,15,5,11,12,13,14,
1,2,3,4,5,11,12,13,14,15,

あなたを納得させるために、さらにいくつかの出力:

1,2,6,14,15,5,11,12,32,100,
1,2,5,6,11,12,14,15,32,100,

1,2,100,143,1500,5,112,121,320,1000,
1,2,5,100,112,121,143,320,1000,1500,

12,20,100,143,179,5,12,121,320,430,
5,12,12,20,100,121,143,179,320,430,
于 2014-02-11T08:26:42.707 に答える