【问题标题】:Quicksort in C, with hoare partitionC中的快速排序,带有hoare分区
【发布时间】:2012-05-25 18:28:38
【问题描述】:
#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 中是如何工作的。

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

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

【问题讨论】:

  • 你试过在上面使用调试器吗?
  • 这是作业吗?如果没有,请考虑使用标准 C 函数qsort()
  • 顺便说一句,如果你的代码格式更好
  • 我喜欢这个拼写错误:quicksnort :)

标签: c algorithm quicksort


【解决方案1】:

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

【讨论】:

  • 我正在研究您的解决方案。但说实话,我不确定。我正在使用 gcc,并且我有虚拟 xubuntu。你的意思是“gcc -g”吗?
  • 无论您使用哪种编译器 - 所以可能是 gcc。重要的部分是 -g。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 对不起,其中一个被命名为分区,但我错误地把它改成了 quicksnort。我只是在这里发布时才这样做,所以当正确更改为分区时,它并不能解决问题。 (我这样做是因为最初我用另一种语言命名它,为了您的舒适,我想重命名它)。但是,问题依然存在。
  • 是的,对不起,我应该意识到这一点。我编辑了我的答案。确保所有变量在使用之前都已初始化。我很肯定这是由于内存不足而导致的核心转储。此外,如果您想要一个带有 GUI 的调试器并且您在 Unix/Solaris 机器上,请查看您是否安装了 dbxtool。如果你想去下载它,它带有 Solaris / Sun Studio。
  • 意思是给他们像“int p=0;”这样的价值?因为我对所有变量都这样做了,但问题仍然存在。此外,正在获取该调试器​​。
  • 我在 xubuntu linux 上。不幸的是,我要花很长时间(这意味着大约 6 小时,如果我全速运行的话)来下载 Sun Studio,因为我的互联网连接速度相对较慢。因此,如果您有一些较小的调试器可以推荐,那就太好了,否则我将不得不等待(或者奇迹般地,我会在我的计算机上找到调试器)。
  • 你应该已经拥有dbx。另请查看gdbmdb,具体取决于您的需要。当程序崩溃时,您收到的确切错误消息是什么?
【解决方案3】:

我认为partition 中的循环设置i 会递减而不是递增。

您想将ij 朝相反的方向移动,但您将它们都递减。

【讨论】:

  • 是的,这是一个错误,但事实并非如此。它仍然无法正常工作。
猜你喜欢
  • 2018-05-27
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 2019-07-19
  • 2015-10-28
相关资源
最近更新 更多