随机快速排序[某些输入崩溃]

时间:2010-12-12 23:23:16

标签: c++ quicksort

我删除了代码,因为它是作业。如果您确实需要帮助,您可以查看我与George B(下文)或PM me的讨论。


你好。这是一项家庭作业。我已经针对其他排序算法和Q.S.进行了测试。是唯一一个在一些随机输入上崩溃的人。

该程序退出很长时间(包括其他内容),但输入是随机生成的....

我花了几个小时跟踪代码,仍然无法找出任何错误.... 适量对于专业人士而言可能非常容易,所以我希望收到有关此实施的建议......

感谢任何输入!


问:什么是“随机”?

答:包括一部分代。

void randomArray(unsigned long*& A, unsigned long size)
{
 //Note that RAND_MAX is a little small for some compilers (2^16-1).
 //In order to test our algorithms on large arrays without huge
 //numbers of duplicates, we'll set the high-order and low-order
 //parts of the return value with two random values.
 A = new unsigned long[size];
 for(unsigned long i=0; i<size; i++)
  A[i] = (rand()<<16) | (rand());

 //Another note:  initially, if you want to test your program out with smaller
 //arrays and small numbers, just reduce A[i] mod k for some small value k as in the following:
 //A[i] = rand() % 16;
 //this may help you debug at first.
}

问:出现什么样的错误?

好吧,我没有收到编译错误。没有Q.S.,我可以运行其他四种排序算法而没有问题(我可以连续运行排序)。当Q.S被激活时,在运行程序一到两次或三次之后,甚至在第一次运行时,程序结束(我正在使用Eclipse,因此控制台结束)。

  

输入元素数量,或者a   退出的负数:5 {some   阵列}

     

选择排序花了0秒。合并   排序花了0秒。快速排序花了0   秒。堆排序耗时0秒。   铲斗排序花了0秒。 {输出   5个排序的数组}

     

输入元素数量,或者a   退出的负数:6 {some   阵列}

     

选择排序花了0秒。合并   排序花了0秒。快速排序花了0   秒。堆排序耗时0秒。   铲斗排序需要0秒。

     

{5个排序数组的输出}

     

输入元素数量,或者a   要退出的负数:8 {arrays}   ---控制台结束---

同样,问题是它经常崩溃,所以这表明访问违规的可能性很高,但是做了10多次追踪我没有看到问题....(也许我超载了我的大脑堆栈 - _ - )

感谢。

2 个答案:

答案 0 :(得分:1)

提示:

q is unsigned (the result of the partition function)
so, q-1 is also unsigned
what if q is zero?

(这是作业,所以你必须弄清楚我猜:))

答案 1 :(得分:0)

使用数组{2,5,2}跟踪算法。显然,只要列表中有重复的数字,您的程序就会崩溃。分区的第一次调用将返回2作为r的索引。因此,quickSort(A,3,2)的第二次调用将访问不在数组边界内的存储器位置。总是一个好主意是手动对数组进行边界检查并生成可理解的输出,以便更容易地跟踪和调试程序。