3

だから私は数日前にCでプログラミングを始めたばかりで、ソートされていない整数でいっぱいのファイルを取り、クイックソートの 第1アルゴリズムを使用してソートするこのプログラムがあります

これで私が間違ったことについて何か提案はありますか?

4

3 に答える 3

5

あなたが説明したことから、あなたはほとんどそこにいるように聞こえます. コレクションの他のすべてのメンバーの 90% に等しい (またはそれより大きい) 値を持つコレクションの最初の要素を取得しようとしています。あなたはすでにソートを行っています。残りは単に次の手順に従う必要があります(私があなたの質問を理解していれば):

1)コレクションを配列にソートします(すでにこれを行っていると思います)
2)コレクション内の数値をカウントし、float n; //コレクション内の要素の数に
格納します3)ソートされた配列を介して0.9 * n番目の要素にインデックスを付けます(ピック)そのポイントを超えた最初のものは前の複製ではありません)
4)結果の表示

これは、私が説明したものの実装です(一種、保存しませんでしたn):(乱数ジェネレーターなどは無視してください。配列を取得するための高速な方法です)

#include <ansi_c.h>
#include <windows.h>
int randomGenerator(int min, int max);
int NotUsedRecently (int number);
int cmpfunc (const void * a, const void * b);

int main(void)
{
    int array[1000];
    int i;

    for(i=0;i<1000;i++)
    {
        array[i]=randomGenerator(1, 1000);
        Sleep(1);
    }

    //sort array
    qsort(array, 1000, sizeof(int), cmpfunc);

    //pick the first non repeat 90th percent and print
    for(i=900;i<999;i++)
    {
        if(array[i+1] != array[i])
        {
            printf("this is the first number meeting criteria: %d", array[i+1]);
            break;
        }
    }
    getchar();  

    return 0;
}






int cmpfunc (const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b );
}


int randomGenerator(int min, int max)
{
    int random=0, trying=0;

    trying = 1;         
    srand(clock());
    while(trying)
    {

        random = (rand()/32767.0)*(max+1);
        (random >= min) ? (trying = 0) : (trying = 1);
    }

    return random;
}

そして、アルゴリズムが選択したものと比較した、最初にランダムに生成された配列 (90 パーセンタイルを中心に) の出力を次に示します。左側の列は要素番号、右側の列はランダムに生成された整数の並べ替えられたリストです。(繰り返しをスキップして、 90% を超える最小値を確保することに注意してください)

ここに画像の説明を入力 ここに画像の説明を入力

要約すると: 私が言ったように、私はあなたがすでにほとんどそこにいると思います. 私のコードのこのセクションがあなたのものとどれほど似ているかに注目してください:

ここに画像の説明を入力

あなたはすでに非常によく似たものを持っています。配列の 90% のインデックス (それが何であれ) を調べ始めるように変更してから、前の値と等しくない最初の値を選択するだけです。

于 2013-11-14T17:02:29.640 に答える
1

この部分によると:

int output = array[(int)(floor(0.9*count)) + 1];
int x = (floor(0.9*count) + 1);

while (array[x] == array[x + 1])
{
    x = x + 1;
}
printf(" %d ", output);  

x超過したかどうかを確認しないうちにcount... (上位 10% の数値がすべて等しい場合はどうなりますか?)output最初の行に設定して最後に印刷しますが、その間は何もしません。(したがって、その間のすべての行は何もしません)。

あなたは間違いなく正しい軌道に乗っています。

于 2013-11-14T17:08:38.993 に答える
1

コードの問題の 1 つは、出力が見つかったら、2 番目のアルゴリズムにブレーク ケースが必要なことです。また、特定の条件下を除き、for ループで変数を宣言することはできません。どうやってコンパイルしたのかわかりません。

于 2013-11-14T17:12:16.910 に答える