C中的Quicksort,带有hoare分区

时间:2012-05-25 18:28:38

标签: c algorithm quicksort

#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中工作的。

(好吧,我知道他们指的是单元格和东西,但是我迷失了指针,指针或功能指针,或功能指针表等等。我真的不喜欢知道在哪里可以获得更具体的信息)

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

3 个答案:

答案 0 :(得分:2)

在调试器中运行它并查看。使用cc -g进行编译,以便与调试器兼容。 Google dbx cheatsheet可以学习基本命令。学习基本的调试器使用时间会比花在编写帖子上的时间更短,这就是为什么它是一个很好的工具,可以将时间用于学习。

答案 1 :(得分:1)

您的代码中存在一些错误......

p,r,q在您使用之前未定义。

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

我认为正在发生的事情是你因为无效的值(p,r,q等等)无限递归而且你的操作系统最终耗尽了你的程序。

另外,请更好地格式化代码,以便更容易阅读。对每个子句或语句使用嵌套结构和8个空格或Tab。

答案 2 :(得分:1)

我认为设置partition的{​​{1}}中的循环会递减而不是递增。

您希望将ii向相反的方向移动,但是您将两者都减少。

相关问题