随机快速排序C#

时间:2016-11-22 18:53:02

标签: c# arrays stack-overflow quicksort array-algorithms

我试图用C#上的随机数据分析快速排序算法。这是我试图测试的代码:

//begeeben.wordpress.com/2012/08/22/randomized-quick-sort-in-c/ using System; using System.Collections.Generic; using System.Text; using System.Diagnostics; class Quicksort {
    public static void RandomizedQuickSort(int[] input, int left, int right)
    {
        if (left < right)
        {
            int q = RandomizedPartition(input, left, right);
            RandomizedQuickSort(input, left, q - 1);
            RandomizedQuickSort(input, q + 1, right);
        }
    }
    private static int RandomizedPartition(int[] input, int left, int right)
    {
        Random random = new Random();
        int i = (left + random.Next()) % (right-left+1);

        int pivot = input[i];
        input[i] = input[right];
        input[right] = pivot;

        return Partition(input, left, right);
    }
    private static int Partition(int[] input, int left, int right)
    {
        int pivot = input[right];
        int temp;

        int i = left-1;
        for (int j = left; j < right; j++)
        {
            if (input[j] <= pivot)
            {
                i++;
                temp = input[j];
                input[j] = input[i];
                input[i] = temp;
            }
        }

        input[right] = input[i+1];
        input[i+1] = pivot;

        return i;
    }
    static void Main(string[] args)
    {
        Random random = new Random();
        Stopwatch stopWatch;
        int []array;
        int size = 10;
        for (int j = 1; j < 7; ++j)
        {
            stopWatch = Stopwatch.StartNew();
            array = new int[size];
            for (int i = 0; i < 10; ++i) array[i] = random.Next(0, 300);
            stopWatch.Start();
            RandomizedQuickSort(array, 0, size-1);
            stopWatch.Stop();
            Console.WriteLine("Number of millisec to sort " + size + " elements: " + stopWatch.ElapsedMilliseconds);
            size = size * 10;
        }
    } 
}

在尝试对10,000,000个元素进行排序之前,一切都很顺利。那时我得到了一个堆栈溢出异常。我尝试使用较小的整数,但这也导致我出现堆栈溢出问题。似乎当代码终止时,左和右都等于零。但是,Merge排序异常是不是已经抓住了这个?

〜更新:问题是阵列大小太大,以至于我用完了整个堆!为了解决这个问题,我不得不从递归算法切换到迭代算法。

1 个答案:

答案 0 :(得分:0)

C#的最大堆栈大小为1Mb,您可以全部使用它。这只是递归实现的内置限制。

你有3个解决方案:
1)构建算法的迭代版本(最高性能)
2)增加堆栈大小,例如:

Thread T = new Thread(threadEntryPoint, stackSizeInBytes);
T.Start();

3)将分析限制在此算法可以处理的列表大小。