[英]Sorted array using 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個隨機數時,它就會對它進行排序。
填充和排序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
小於right
,則分析程序的行為方式。 你有一個無限循環while (true)
,因為有兩個while
s的忽略, if
不改變的值left
或right
。 如果數組中有重復項,則會出現這種情況。 例如,當您嘗試僅使用1,000個數字填充1,000,000個元素時,就會發生這種情況。
順便說一句。 如果用可變length
和length
替換每個1000000,你的代碼會更好。 lengthTwo
可以用length
替換。 為什么? 在這種情況下,當您想要檢查更大數組的程序行為時。 更改一個變量的值比五個數字更容易。
我希望我幫忙。
對不起,但你等了多久? 我懷疑填充1mil整數數組的while循環需要很長時間,因為它調用Next方法1,000,000次。 您是否看到以下輸出:'QuickSort by recursive method'?
我剛才偶然發現了這個錯誤,錯誤就在這里
QuickSort_Recursive(myArray,0,lengthTwo - 1);
改為
QuickSort_Recursive(myArray,0,length - 1);
對於你的分區,我認識到hoare的算法(比替代方案更快) https://cs.stackexchange.com/questions/11458/quicksort-partitioning-hoare-vs-lomuto這里的兩個偽代碼(你會看到我在開始時= p + 1和j = p-1否則它是好的)
雖然此回復距離提出問題的時間非常遠,但以下內容對於閱讀該問題的人來說非常有用。
問題中提到的代碼的問題是,只要兩端的樞軸元素相似(左側和右側),它就會在分區函數上產生無限循環
以下是修改后的代碼:
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;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.