ページ 1 / 1
配列Aによって配列Bを並び替え
Posted: 2015年10月10日(土) 21:07
by くっちゃべー
配列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;
}
}
}
}
Re: 配列Aによって配列Bを並び替え
Posted: 2015年10月10日(土) 22:00
by box
くっちゃべー さんが書きました:
以下のようにプログラミングしたのですが、合っていますでしょうか?
まずは、自分でテストしてみてください。
Re: 配列Aによって配列Bを並び替え
Posted: 2015年10月10日(土) 22:09
by くっちゃべー
どのようなデータでやればよいでしょうか?
できれば、テスト用のデータをください。
Re: 配列Aによって配列Bを並び替え
Posted: 2015年10月10日(土) 22:18
by box
くっちゃべー さんが書きました:どのようなデータでやればよいでしょうか?
それを自分で考えることもプログラミングのうちに入ります。
Re: 配列Aによって配列Bを並び替え
Posted: 2015年10月10日(土) 22:26
by くっちゃべー
データを用意してテストしてみました。
結果はうまくソートできていませんでした。
実際にはただの降順になっていました。
これはデータが悪いのでしょうか?プログラムがおかしいのでしょうか?
Re: 配列Aによって配列Bを並び替え
Posted: 2015年10月10日(土) 22:38
by box
どんなデータを与えたとき、本当はどうなってほしいのに実際にはどうなったのですか?
仮にだれかにテストしてほしいのであれば、
・main関数を含む、実際にコンパイルできるコードすべて
・テストデータの例
を提示する必要があると思います。
Re: 配列Aによって配列Bを並び替え
Posted: 2015年10月10日(土) 22:50
by くっちゃべー
以下が実際のコードです。
コード:
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を並び替え
Posted: 2015年10月11日(日) 00:06
by かずま
参考になりますか?
コード:
#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を並び替え
Posted: 2015年10月11日(日) 11:45
by くっちゃべー
参考になるコードありがとうございます。
望んだ結果が得られました。
また、何が問題だったのかもよくわかりました。
素晴らしい回答ありがとうございました。