#include<stdio.h>
#include <time.h>
#include <stdlib.h>
int w, q, p, r;
int tab[100];
void main ()
{
int i;
srand(time(0));
for (i = 0; i < 100; i += 1)
{
tab[i]=rand()%100;
}
display(tab);
r = 37;
quicksnort(tab, 0, r-1);
display(tab);
}
int display (int tab[])
{
int i;
printf("\n Your numbers : \n");
for (i = 0; i < 100; i += 1)
{
printf(" %d", tab[i]);
}
}
int quicksnort(int tab[], int m, int n)
{
if (p<r)
{
q = partition(tab, m, n);
quicksnort(tab, m, q-1);
quicksnort(tab, q+1, n);
}
}
int partition(int tab[], int p, int r)
{
int x, i, j, part;
x = tab[p];
i = p-1;
j = r+1;
do
{
do
{
j = j-1;
} while (tab[j]<=x && j>=0);
do
{
i = i+1;
} while (tab[i]>=x && i<=0);
if (i<j)
{
part = tab[i];
tab[i]=tab[j];
tab[j]=part;
}
else
{
return j;
}
} while (1);
}
嗨,我上面的代码有问题。它会编译,但是当我运行它时,它会停止并显示某种“核心转储”警报。 它基于hoare版本的快速排序,在该peudocode上http://screenshooter.net/5359896/jyuogoj 我已经尝试了一切使其工作,我认为它可能与指针有关。我认为这是因为我不确定它们是如何在C中工作的。
(好吧,我知道他们指的是单元格和东西,但是我迷失了指针,指针或功能指针,或功能指针表等等。我真的不喜欢知道在哪里可以获得更具体的信息)
但也许解决方案比这简单。
答案 0 :(得分:2)
在调试器中运行它并查看。使用cc -g
进行编译,以便与调试器兼容。 Google dbx cheatsheet
可以学习基本命令。学习基本的调试器使用时间会比花在编写帖子上的时间更短,这就是为什么它是一个很好的工具,可以将时间用于学习。
答案 1 :(得分:1)
您的代码中存在一些错误......
p,r,q在您使用之前未定义。
我很惊讶你编译时没有收到任何警告。
我认为正在发生的事情是你因为无效的值(p,r,q等等)无限递归而且你的操作系统最终耗尽了你的程序。
另外,请更好地格式化代码,以便更容易阅读。对每个子句或语句使用嵌套结构和8个空格或Tab。
答案 2 :(得分:1)
我认为设置partition
的{{1}}中的循环会递减而不是递增。
您希望将i
和i
向相反的方向移动,但是您将两者都减少。