3

私は2つの要素char *wordとで構成される構造を持っていint numberます。バブルソートを使用してそれらをソートする場合、両方の交換パーツを作成する必要があります。

int i,j,tmp;
    char * temp;
    for(i=0; i<max;i++)
    {
        for(j=0;j<max-i;j++)
        {
            if(strcmp(array[j].word,array[j+1].word)>0)
            {
                temp=array[j].word;
                array[j].word=array[j+1].word;
                array[j+1].word=temp;
                tmp=array[j].number;
                array[j].number=array[j+1].number;
                array[j+1].number=tmp;

            }
        }
    }

私の構造体宣言を編集する

typedef struct{
    char *word;
    int number;
}
words;
words *array=NULL;

配列にn個の要素がある場合はどうなりますか?それはすべてを交換するのに非常に時間がかかります。これを省略する方法はありますか?

私が使いたくない他のソートアルゴリズム(のようなqsort)を除いて、コースの。

4

3 に答える 3

4

スワッピングプロセスのパフォーマンスに懸念がある場合は、使用している構造体タイプのポインターの配列を検討する必要があります。

struct your_stuct *arr[MAX];

この配列を正しく設定すると、スワップは構造体の内容ではなくメモリアドレスのみを変更し、より高速に実行できるようになります。

内側のループ内で使用する必要があります:

struct your_struct *temp;
temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;

これはあなたの質問の意味ですか?

于 2012-09-19T18:56:39.070 に答える
2

自分自身をソートするのではなくstructs、構造体へのポインターの配列と、構造体からポインターを介して適切な値を読み取る適切な比較関数を作成し、ポインターのリストをソートします。もちろん、構造体はかなり小さいため、余分な間接参照はすべて、実際に構造体を交換しないことで得られるパフォーマンスの向上を妨げる可能性がありますが、大きな構造体の場合、このアプローチは非常に理にかなっています。

于 2012-09-19T18:57:34.000 に答える
0
int i, j, tmp;
words temp;

for (i = 0; i < max; i++)
{
    for (j = 0; j < max - i; j++)
    {
        if (strcmp(array[j].word, array[j + 1].word) > 0)
        {
            memcpy(&temp, array[j], sizeof(words));
            memcpy(array[j], array[j + 1], sizeof(words));
            memcpy(array[j + 1], &temp, sizeof(words));
        }
    }
}
于 2012-09-19T19:02:48.857 に答える