0

クイックソートを実行するアプリケーションがあります。より大きな数字を渡すまでは問題なく動作していました (最初に取得したのは 10000000 でした)。aStackoverflowが再帰によって引き起こされることは理解していますが、それが原因でアプリケーションが爆撃される理由がわかりません。アドバイスをいただければ幸いです。これが私のコードです:

class quickSort
{
    const int NOOFELEMENTS = 10000000;
    // this is our array to sort
    private int[] arr = new int[NOOFELEMENTS];

    // this holds a number of elements in array
    private int len;

    // Quick Sort Algorithm
    public void QuickSort()
    {
        sort(0, len - 1);
    }

    public void sort(int left, int right)
    {
        int pivot, l_holder, r_holder;

        l_holder = left;
        r_holder = right;
        pivot = arr[left];

        while (left < right)
        {
            while ((arr[right] >= pivot) && (left < right))
            {
                right--;
            }

            if (left != right)
            {
                arr[left] = arr[right];
                left++;
            }

            while ((arr[left] <= pivot) && (left < right))
            {
                left++;
            }

            if (left != right)
            {
                arr[right] = arr[left];
                right--;
            }
        }

        arr[left] = pivot;
        pivot = left;
        left = l_holder;
        right = r_holder;

        if (left < pivot)
        {
            sort(left, pivot - 1);
        }

        if (right > pivot)
        {
            sort(pivot + 1, right);
        }
    }

    public static void Main()
    {
        quickSort q_Sort = new quickSort();

        int[] arr = new int[NOOFELEMENTS];

        Random rnd = new Random();
        for (int i = 0; i < NOOFELEMENTS; i++)
        {
            arr[i] = rnd.Next(0, 1000);
        }
        q_Sort.arr = arr;
        q_Sort.len = q_Sort.arr.Length;

        var startTime = DateTime.Now;

        // Sort the array
        q_Sort.QuickSort();

        Console.WriteLine("Total Time: {0}\n", DateTime.Now - startTime);

    }
}
4

1 に答える 1

1

良い。コードは、log2 10000000 から 10000000 レベルの深さで再帰します。

多くのスタックスペースを使用できるコンパイラ (存在する場合) の末尾再帰の最適化に依存します。

于 2012-10-15T02:44:57.853 に答える