2013-08-22 179 views
0

我有一个数组创建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

['Array.Sort'](http://msdn.microsoft.com/en-us/library/system.array.sort.aspx)使用快速排序interally。 – Romoku

+2

“它不会这样做”有点含糊。请具体说明您的问题。 –

+1

什么是你的问题通过这个文件,它一定会给你清晰的图片http://vinayakgarg.wordpress.com/2011/10/25/time-comparison-of-quick-sort-insertion-sort-and-bubble -sort/ –

回答

2

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

在分区方法中,您的算法存在错误。 如果leftright较小你应该增加left,降低right

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

分析你的程序的行为,如果myArray[left]大于或等于pivotmyArray[right]较小或等于比pivotleftright较小。 您有一个无限循环while (true),因为两个while被忽略,而if不会更改leftright的值。 如果数组中有重复项,则会出现这种情况。例如,当您尝试用1,000个数字填充1,000,000个元素时,就会发生这种情况。

Btw。如果用变量lengthlengthTwo替换为length,则代码会更好。 为什么?在这种情况下,当你想检查程序行为的更大阵列。更改一个变量的值比五个数字更容易。

我希望我能帮上忙。

+0

谢谢!这工作完美! :d – user2599678

0

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

+0

我是的。我跑出了弹出的程序,我像这样离开了10分钟,没有发生任何事情 – user2599678

0

虽然这个回复离提问时间很远,但对于阅读问题的任何人来说,以下内容都很有用。

在这里,在问题中提到,这将会对分区功能无限循环每当转动部件的两端相似(左,右)代码的问题是修改后的代码得到它working:

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

     } 
    }