我有一个数组创建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个随机数时,它就会对它进行排序。
答案 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]
大于或等于pivot
,myArray[right]
小于或等于pivot
且left
小于{{},请分析您的计划的行为方式1}}。
您有一个无限循环right
,因为忽略了两个while (true)
,while
不会更改if
或left
的值。
如果数组中有重复项,则会出现这种情况。例如,当您尝试仅使用1,000个数字填充1,000,000个元素时就会发生这种情况。
顺便说一下。如果用变量right
替换每个1000000,length
可以替换为lengthTwo
,则代码会更好。
为什么?在这种情况下,当您想要检查更大数组的程序行为时。更改一个变量的值比五个数字更容易。
我希望我能帮忙。
答案 1 :(得分:0)
答案 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;
}
}
}