1

こんにちは、コードがスタック オーバーフローを引き起こし、マージ ソート アルゴリズムの上限と下限がどこかで変更されるべきではないという理由がまだわかりません..

    int[] arr = new int[10];
    private void button1_Click(object sender, EventArgs e)
    {
        merge_sort(0, 9);
    }

    private void merge_sort(int left, int right)
    {
        if (left > right)
            merge(left, right, (left + right) / 2);
        else
            merge_sort((left + right) / 2 + 1, right);
        merge_sort(left, (left + right) / 2);

    }
    void merge(int low, int high, int mid)
    {
        int i, j, k, t;
        j = low;
        for (i = mid + 1; i <= high; i++)
        {
            while (arr[j] <= arr[i] && j < i)
                j++;
            if (j == i)
                break;
            t = arr[i];
            for (k = i; k > j; k--)
                arr[k] = arr[k - 1];
            arr[j] = t;
        }
    }
4

3 に答える 3

1

最後の行は常に merge_sort を再度呼び出して呼び出されるため、merge_sort 再帰メソッドは決して終了しません...これは無限再帰であり、stackoverflow が発生するはずです。

private void merge_sort(int left, int right)
{
    if (left > right)
    merge(left, right, (left + right) / 2);
 else
    merge_sort((left + right) / 2 + 1, right);
 merge_sort(left, (left + right) / 2);  //<-- this is your problem!
} 

私は(多分)代わりにそれをしたかったと思います:

private void merge_sort(int left, int right)
{
    if (left > right)
    merge(left, right, (left + right) / 2);
 else
 {
    merge_sort((left + right) / 2 + 1, right);
    merge_sort(left, (left + right) / 2)
 }
} 
于 2012-05-17T11:13:18.507 に答える
0

あなたが持っている

merge_sort((left + right) / 2 + 1, right);

私がそうあるべきだと思う

merge((left + right) / 2 + 1, right);
于 2012-05-17T11:10:02.177 に答える
0

このようにコードを変更しました。スタック オーバーフローの問題は解決しましたが、正しい結果が得られません!!!

    private void merge_sort(int left, int right)
    {
        if (left > right)
            merge(left, right, (left + right) / 2);
        else
        {
            merge_sort((left + right) / 2 + 1, right);
            merge(left, right, (left + right) / 2+1);

        }

    }

最近、コードの一部を変更してそれを制御する方法を見つけましたが、何が問題なのかまだわかりません!!!! 変更点は次のとおりです。

    private void merge_sort(int low, int high)
    {

int mid;
        if (low != high)
        {
            mid = (low + high) / 2;
            merge_sort(low, mid);
            merge_sort(mid + 1, high);
            merge(low, mid, high);
        } 
于 2012-05-17T19:43:07.673 に答える