配列Aによって配列Bを並び替え

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
くっちゃべー

配列Aによって配列Bを並び替え

#1

投稿記事 by くっちゃべー » 9年前

配列Aの値によって2次元配列Bをソートする方法を教えて欲しいです。
2次元配列Bのソートは行でソートしたいです。
以下のようにプログラミングしたのですが、合っていますでしょうか?

コード:

//A:TotalDistance,B:Routeです。
        for (int i = 0; i < VolumeRoute; i++)
        {
            for (int j = i + 1; j < VolumeRoute; j++)
            {
                if (TotalDistance[j] < TotalDistance[j - 1])//TotalDistanceの小さい順にする
                {
                    for (int k = 0; k < VolumeData; k++)
                    {
                        int temp = Route[j][k];
                        Route[j][k] = Route[j - 1][k];
                        Route[j - 1][k] = temp;
                    }
                }
            }
        }

box
記事: 2002
登録日時: 14年前

Re: 配列Aによって配列Bを並び替え

#2

投稿記事 by box » 9年前

くっちゃべー さんが書きました: 以下のようにプログラミングしたのですが、合っていますでしょうか?
まずは、自分でテストしてみてください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

くっちゃべー

Re: 配列Aによって配列Bを並び替え

#3

投稿記事 by くっちゃべー » 9年前

どのようなデータでやればよいでしょうか?
できれば、テスト用のデータをください。

box
記事: 2002
登録日時: 14年前

Re: 配列Aによって配列Bを並び替え

#4

投稿記事 by box » 9年前

くっちゃべー さんが書きました:どのようなデータでやればよいでしょうか?
それを自分で考えることもプログラミングのうちに入ります。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

くっちゃべー

Re: 配列Aによって配列Bを並び替え

#5

投稿記事 by くっちゃべー » 9年前

データを用意してテストしてみました。
結果はうまくソートできていませんでした。
実際にはただの降順になっていました。
これはデータが悪いのでしょうか?プログラムがおかしいのでしょうか?

box
記事: 2002
登録日時: 14年前

Re: 配列Aによって配列Bを並び替え

#6

投稿記事 by box » 9年前

どんなデータを与えたとき、本当はどうなってほしいのに実際にはどうなったのですか?
仮にだれかにテストしてほしいのであれば、
 ・main関数を含む、実際にコンパイルできるコードすべて
 ・テストデータの例
を提示する必要があると思います。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

くっちゃべー

Re: 配列Aによって配列Bを並び替え

#7

投稿記事 by くっちゃべー » 9年前

以下が実際のコードです。

コード:

int main(){
    int VolumeRoute = 10,VolumeData = 20;
    int Route[10][20];

    int TotalDistance[10] = {8,2,5,4,7,3,0,1,6,9};
    //↑実際にはランダムに値が入っている。8なら7番目に小さいとしてRoute[8][]に並び替える
    
    for (int i = 0; i < VolumeRoute; i++)
    {
        for (int j = 0; j < VolumeData; j++)
        {
            Route[i][j] = j + 1;
        }
        for (int k = 0; k < rand() % 15 + 1; k++)
        {
            int num = rand() % 19;
            int temp = Route[i][num];
            Route[i][num] = Route[i][1];
            Route[i][1] = temp;
        }
    }
    
    for(int i = 0; i < VolumeRoute; i++){
        for(int j = 0; j < VolumeData; j++){
            printf("Before[%d]:%d ",i,Route[i][j]);
        }
        printf("\n");
    }
    
    printf("\n");
    
    for (int i = 0; i < VolumeRoute; i++)
    {
        for (int j = i + 1; j < VolumeRoute; j++)
        {
            if (TotalDistance[j] < TotalDistance[j - 1])//TotalDistanceの小さい順にする
            {
                for (int k = 0; k < VolumeData; k++)
                {
                    int temp = Route[j][k];
                    Route[j][k] = Route[j - 1][k];
                    Route[j - 1][k] = temp;
                }
            }
        }
    }
    
    for(int i = 0; i < VolumeRoute; i++){
        for(int j = 0; j < VolumeData; j++){
            printf("After[%d]:%d ",i,Route[i][j]);
        }
        printf("\n");
    }
}

かずま

Re: 配列Aによって配列Bを並び替え

#8

投稿記事 by かずま » 9年前

参考になりますか?

コード:

#include <stdio.h>

#define R  4
#define D  3

int a[R] = { 3, 1, 4, 2 };
int b[R][D] = {
    { 30, 31, 32 },
    { 10, 11, 12 },
    { 40, 41, 42 },
    { 20, 21, 22 },
};

void print(void)
{
    printf("a:");
    for (int i = 0; i < R; i++)
        printf(" %d", a[i]);
    printf("\nb:\n");
    for (int i = 0; i < R; i++) {
        for (int j = 0; j < D; j++) 
            printf(" %3d", b[i][j]);
        printf("\n");
    }
    printf("\n");
}

int main(void)
{
    print();
    for (int i = 0; i < R; i++) {
        int m = i;
        for (int j = i + 1; j < R; j++)
            if (a[j] < a[m]) m = j;
        if (m != i) {
            int t = a[i]; a[i] = a[m]; a[m] = t;
            for (int k = 0; k < D; k++) {
                t = b[i][k]; b[i][k] = b[m][k]; b[m][k] = t;
            }
        }
    }
    print();
    return 0;
}

くっちゃべー

Re: 配列Aによって配列Bを並び替え

#9

投稿記事 by くっちゃべー » 9年前

参考になるコードありがとうございます。
望んだ結果が得られました。
また、何が問題だったのかもよくわかりました。
素晴らしい回答ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る