C++ 随机快速排序[在某些输入上崩溃]

C++ 随机快速排序[在某些输入上崩溃],c++,quicksort,C++,Quicksort,我删除了代码,因为这是家庭作业。如果您真的需要帮助,您可以查看我与George B(以下)的讨论,也可以PM我。 嗨,伙计们。这是一个家庭作业。我已经用其他排序算法对它进行了测试,Q.S.是唯一一个在一些随机输入上崩溃的算法 程序退出时间很长(还有其他内容),但输入是随机生成的 我花了几个小时追踪代码,仍然无法找出任何错误。。。。 对于专业人士来说,Q.S.可能非常容易,因此我希望收到关于此实施的建议 欢迎您的任何意见 什么是“随机”? 答:包括一部分发电 void randomArray(

我删除了代码,因为这是家庭作业。如果您真的需要帮助,您可以查看我与George B(以下)的讨论,也可以PM我。


嗨,伙计们。这是一个家庭作业。我已经用其他排序算法对它进行了测试,Q.S.是唯一一个在一些随机输入上崩溃的算法

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

我花了几个小时追踪代码,仍然无法找出任何错误。。。。 对于专业人士来说,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.
}
void随机数组(无符号长*&A,无符号长大小)
{
//请注意,对于某些编译器(2^16-1),RAND_MAX有点小。
//为了在大型阵列上测试我们的算法,而不需要巨大的
//重复的数量,我们将设置高阶和低阶
//具有两个随机值的部分返回值。
A=新的无符号长[大小];
对于(无符号长i=0;i提示:

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

提示:

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

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

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

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

单词“随机”和“排序”一起使用有点混乱。你能告诉我们错误是什么吗?嗨,是的。我用答案和完整的程序编辑了我的帖子…我希望这有助于调试…谢谢…我仍在跟踪…:/单词“随机”和“排序”一起使用有点混乱。你能告诉我们错误是什么吗?嗨,是的。我用答案和完整的程序编辑了我的帖子…我希望这有助于调试…谢谢…我仍在跟踪…:/首先,谢谢你的提示!这是真的…当我做这个QS时,我以前的一个实现识别到了t这也是一个问题。谢谢。但我现在忘了更改它……但是,问题是,分区在接口中使用了无符号long,即使我显式使用int……程序仍然崩溃……int q=分区(A,p,r);快速排序(A,p,int(q-1));快速排序(A,int(q+1),r);你能提供一点关于如何处理这个问题的见解吗?哦,事实上-1不存在……我应该加上它作为立即返回……对吗?我所做的:将unsigned long everywhere改为long,并且成功了:)(好的,我没有对它进行详尽的测试,但我认为它有效)。问题是,如果q是无符号的,如果索引为负数,则值会环绕(-1是2^32-1),这再次导致无法使用->分段错误访问内存。谢谢你,乔治。我知道修复方法。我添加了if(q>0)对于第一个quickSortfirst,谢谢你的提示!这是真的…当我做这个QS时,我以前的一个实现也认识到了这个问题。谢谢。但是我现在忘记更改它了……问题是,分区在接口中使用了unsigned long,即使我显式int…程序仍然崩溃…int q=Pa快速排序(A,p,r);快速排序(A,p,int(q-1));快速排序(A,int(q+1),r);你能提供一些关于如何处理这个问题的见解吗?哦,事实上-1不存在……我应该立即添加它作为返回……对吗?我做了什么:将unsigned long everywhere改为long,并且成功了:)(好的,我没有对它进行详尽的测试,但我认为它是有效的)。问题是,如果q是无符号的,如果索引为负数,则值会环绕(-1是2^32-1),这再次导致无法使用->分段错误访问内存。谢谢你,乔治。我知道修复方法。我添加了if(q>0)到第一个quickSortright。我要仔细检查条件。谢谢,皮鲁兹。对。我要仔细检查条件。谢谢,皮鲁兹。