0
#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 版本,在那个伪代码http://screenshooter.net/5359896/jyuogoj上准确地说, 我已经尽一切努力让它工作,我认为它可能与指针有关。我认为这是因为我不确定它们在 C 中是如何工作的。

(好吧,我知道它们指向单元格之类的东西,但是我迷失了带有指针的指针,或函数中使用的指针,或函数指针表等。老实说,我不知道在哪里以获取有关此的更具体信息)

但也许解决方案比这更简单。

4

3 回答 3

2

在调试器中运行它并查看。编译cc -g使其与调试器兼容。谷歌dbx cheatsheet学习基本命令。学习基本调试器使用和隔离错误所花费的时间比撰写帖子所花费的时间更少,这就是为什么它是一个投入时间学习的好工具。

于 2012-05-25T18:33:29.717 回答
1

您的代码中有一些错误...

p,r,q 在使用之前没有定义。

我很惊讶您在编译时没有收到任何警告。

我认为正在发生的事情是由于无效值(p,r,q ..等)而无限递归,并且您的操作系统最终耗尽了内存来给您的程序。

另外,请更好地格式化您的代码,以便于阅读。为每个子子句或语句使用嵌套结构和 8 个空格或一个制表符。

于 2012-05-25T18:41:10.900 回答
1

我认为设置的循环partition减少i而不是增加。

你想向相反的方向移动ij但你同时减少它们。

于 2012-05-25T19:32:38.730 回答