使用quicksort排序的数组

时间:2013-08-22 18:29:43

标签: c# arrays sorting random quicksort

我有一个数组创建10个随机整数,然后使用quicksort对它们进行排序。我的问题是,当我将其更改为创建1,000,000个随机整数时,它不会这样做。可以帮助吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace RepeatAssignmentQ2
{
class Program
{
    static public int Partition(int[] myArray, int left, int right)
    {
        int pivot = myArray[left];
        while (true)
        {
            while (myArray[left] < pivot)
                left++;

            while (myArray[right] > pivot)
                right--;

            if (left < right)
            {
                int temp = myArray[right];
                myArray[right] = myArray[left];
                myArray[left] = temp;
            }
            else
            {
                return right;
            }

        }
    }

    static public void QuickSort_Recursive(int[] arr, int left, int right)
    {
        // For Recusrion
        if (left < right)
        {
            int pivot = Partition(arr, left, right);

            if (pivot > 1)
                QuickSort_Recursive(arr, left, pivot - 1);

            if (pivot + 1 < right)
                QuickSort_Recursive(arr, pivot + 1, right);
        }
    }

    static void Main(string[] args)
    {
        Random rnd = new Random();
        DateTime startTime = DateTime.Now;

        int ind = 0;
        int length = 1000000;
        int[] myArray = new int[length];

        while (ind < 1000000)
        {
            myArray[ind] = rnd.Next(1000000);
            ind++;
        }

        int lengthTwo = 10;

        Console.WriteLine("QuickSort by recursive method");

        QuickSort_Recursive(myArray,0, lengthTwo - 1 );



        for (int i = 0; i < 1000000; i++)
        {

            Console.WriteLine(myArray[i]);

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



    }
}
}

由于

编辑 - 当我使用具有10个数字的数组调试程序时,它将显示它们并对它们进行排序。当我将其更改为1,000,000并运行程序时,无显示任何内容。

编辑2 - 好的,出于某种奇怪的原因,它正在这样做。我更改了上面的代码以显示更改,它现在显示它随机生成的数字,但不对它们进行排序。但是当IT只需要创建10个随机数时,它就会对它进行排序。

4 个答案:

答案 0 :(得分:2)

填充和排序1,000,000个元素仍然应该非常快。

在分区方法中,您的alhorithm中存在错误。 如果left小于right,则应增加left并减少right

if (left < right)
{
    int temp = myArray[right];
    myArray[right] = myArray[left];
    myArray[left] = temp;
    left++;
    right--;
}

如果myArray[left]大于或等于pivotmyArray[right]小于或等于pivotleft小于{{},请分析您的计划的行为方式1}}。 您有一个无限循环right,因为忽略了两个while (true)while不会更改ifleft的值。 如果数组中有重复项,则会出现这种情况。例如,当您尝试仅使用1,000个数字填充1,000,000个元素时就会发生这种情况。

顺便说一下。如果用变量right替换每个1000000,length可以替换为lengthTwo,则代码会更好。 为什么?在这种情况下,当您想要检查更大数组的程序行为时。更改一个变量的值比五个数字更容易。

我希望我能帮忙。

答案 1 :(得分:0)

请原谅我,但你等了多久?我怀疑填充1mil整数数组的while循环需要很长时间,因为它调用Next方法1,000,000次。您是否看到以下输出:'QuickSort by recursive method'?

答案 2 :(得分:0)

我刚才发现了这个错误,错误就在这里

QuickSort_Recursive(myArray,0,lengthTwo - 1);

将其更改为

QuickSort_Recursive(myArray,0,length - 1);

对于你的分区,我认识到hoare的算法(比替代方法更快)https://cs.stackexchange.com/questions/11458/quicksort-partitioning-hoare-vs-lomuto这里是两个伪代码(你会在开始时看到i = p + 1和j = p-1,否则它是好)

答案 3 :(得分:0)

虽然此回复距离提出问题的时间非常远,但以下内容对于阅读该问题的人来说非常有用。

问题中提到的代码的问题是,只要两端的枢轴元素相似(左和右),它就会在分区函数上产生无限循环

以下是修改后的代码:

static int Partition(int[] myArray, int left, int right)
    {
        int pivot = myArray[left];
        while (true)
        {
            while (myArray[left] < pivot)
                left++;

            while (myArray[right] > pivot)
                right--;

            if (left < right && myArray[left] == myArray[right])
                left++;
            else if (left < right)
            {
                int temp = myArray[right];
                myArray[right] = myArray[left];
                myArray[left] = temp;
            }
            else
            {
                return right;
            }

        }
    }