C# 使用快速排序的排序数组

C# 使用快速排序的排序数组,c#,arrays,sorting,random,quicksort,C#,Arrays,Sorting,Random,Quicksort,我有一个数组,创建10个随机整数,然后使用快速排序对它们进行排序。我的问题是,当我将此更改为创建1000000个随机整数时,它不会这样做。您能帮忙吗 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace RepeatAssignmentQ2 { class Program { static public int Partition(int[] myA

我有一个数组,创建10个随机整数,然后使用快速排序对它们进行排序。我的问题是,当我将此更改为创建1000000个随机整数时,它不会这样做。您能帮忙吗

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();



    }
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间RepeatAssignmentQ2
{
班级计划
{
静态公共int分区(int[]myArray,int left,int right)
{
int pivot=myArray[左];
while(true)
{
while(myArray[左]pivot)
对--;
if(左<右)
{
int temp=myArray[右];
myArray[右]=myArray[左];
myArray[左]=温度;
}
其他的
{
返还权;
}
}
}
静态公共无效快速排序\u递归(int[]arr,int left,int right)
{
//复发
if(左<右)
{
int pivot=分区(arr、左、右);
如果(轴>1)
快速排序(arr,左,枢轴-1);
如果(枢轴+1<右侧)
快速排序(arr,轴+1,右);
}
}
静态void Main(字符串[]参数)
{
随机rnd=新随机();
DateTime startTime=DateTime.Now;
int ind=0;
整数长度=1000000;
int[]myArray=新的int[长度];
而(ind<1000000)
{
myArray[ind]=rnd.Next(1000000);
ind++;
}
int length2=10;
WriteLine(“通过递归方法进行快速排序”);
快速排序(myArray,0,lengthTwo-1);
对于(int i=0;i<1000000;i++)
{
Console.WriteLine(myArray[i]);
}
WriteLine(“总时间:{0}\n”,DateTime.Now-startTime);
Console.WriteLine();
}
}
}
谢谢

编辑-当我tun程序的数组有10个数字时,它将显示它们并对它们进行排序。当我将其更改为1000000并运行程序时,不会显示任何内容


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

对不起,你等了多久?我怀疑填充1mil整数数组的while循环需要很长时间,因为它调用下一个方法1000000次。您是否看到以下输出:“通过递归方法快速排序”?

填充和排序1000000个元素仍然应该非常快

分区方法中的alhorithm中有一个错误。 如果
小于
,则应增加
,减少

if (left < right)
{
    int temp = myArray[right];
    myArray[right] = myArray[left];
    myArray[left] = temp;
    left++;
    right--;
}
if(左<右)
{
int temp=myArray[右];
myArray[右]=myArray[左];
myArray[左]=温度;
左++;
对--;
}
如果
myArray[left]
大于或等于
pivot
myArray[right]
小于或等于
pivot
left
小于
right
,分析程序的行为。 您有一个无限循环
while(true)
,因为两个
while
被忽略,如果
不更改
left
right
的值,则为
。
如果数组中存在重复项,则会发生这种情况。例如,当您试图用1000个数字填充1000000个元素时,就会发生这种情况

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


我希望我能帮上忙。

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

快速排序(myArray,0,lengthTwo-1)

换成

快速排序(myArray,0,长度-1)


对于您的分区,我知道hoare的算法(比另一种算法快),这里有两种算法的伪代码(您将在开始时看到I=p+1和j=p-1,否则很好)

虽然这个回答距离提问时间很远,但以下内容对阅读该问题的任何人都很有用

问题中提到的代码的问题是,每当pivot元素两端(左、右)相似时,它就会在配分函数上形成无限循环

以下是使其工作的修改代码:

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;
            }

        }
    }
静态int分区(int[]myArray,int左,int右)
{
int pivot=myArray[左];
while(true)
{
while(myArray[左]pivot)
对--;
if(left
在内部使用快速排序。“它不会这样做”有点含糊不清。请具体说明您的问题。您的问题是什么?请仔细阅读此文档,它肯定会为您提供清晰的图片@Remoku我相信他们在.net 4.5中更改了它。我是的。我运行了弹出的程序,然后就这样离开了10分钟,其他什么都没有发生