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);
}

こんにちは、上記のコードに問題があります。コンパイルはしますが、実行すると停止し、何らかの「コア ダンプ」のアラートが表示されます。これは、クイックソートのホア バージョンに基づいて ます。Cでどのように機能するかわからないためだと思います。

(わかりました、それらがセルなどを指していることは知っていますが、ポインター付きのポインター、関数で使用されるポインター、または関数へのポインターのテーブルなどで迷子になっています。正直なところ、どこにあるのかわかりませんそれに関するより具体的な情報を得るために探します)

しかし、おそらく解決策はそれよりも簡単です。

4

3 に答える 3

2

デバッガーで実行して確認してください。cc -gデバッガーと互換性があるようにコンパイルします。Googledbx cheatsheetで基本的なコマンドを学習します。基本的なデバッガーの使用法を習得し、エラーを特定するのにかかる時間は、投稿を書くよりも短いため、学習に時間を投資するのに適したツールです。

于 2012-05-25T18:33:29.717 に答える
1

partitionを設定する のループはi、インクリメントするのではなくデクリメントすると思います。

ijを反対方向に移動したいのですが、両方をデクリメントします。

于 2012-05-25T19:32:38.730 に答える
1

コードにいくつかの間違いがあります...

p、r、q は、使用する前に定義されていません。

コンパイル時に警告が表示されなかったことに驚いています。

無効な値(p、r、qなど)のために無限に再帰していて、OSが最終的にプログラムを提供するためにメモリを使い果たしていると思います。

また、読みやすいようにコードをより適切にフォーマットしてください。サブ句またはステートメントごとに、ネストされた構造と 8 つのスペースまたはタブを使用します。

于 2012-05-25T18:41:10.900 に答える