ページ 1 / 1
[初心者]配列、昇順について[急ぎ]
Posted: 2016年1月18日(月) 22:33
by elims
初投稿になります。
以下のように数値を昇順に並び替えるというものなのですが、実行したところ、なぜか30だけ2番目に来てしまいます。
C言語は勉強し始めで、なにが原因かわかりません。
試験が明日に差し迫っており急を要して申し訳ないのですが、ご教授のほどよろしくお願いします。
コード:
#include<stdio.h>
#define N 10
int main(void)
{
int m[N]={12,21,8,25,16,38,22,10,30,7};
int i,j,mp,tmp;
printf("ソート前:\n");
for(i=0; i<N; i++){
printf("%3d",m[i]);
puts("");
}
for(i=0; i<N-1; i++){
mp = 1;
for(j=i+1; j<N; j++){
if(m[j]<m[mp]) mp=j;
}
tmp=m[i];
m[i]=m[mp];
m[mp]=tmp;
}
printf("ソート後:\n");
for(i=0; i<N; i++){
printf("%3d",m[i]);
puts("");
}
return 0;
}
Re: [初心者]配列、昇順について[急ぎ]
Posted: 2016年1月18日(月) 22:49
by Dixq (管理人)
mpってなんのためにつかうんですか?
以下のように無しじゃダメなんでしょうか?
コード:
#include<stdio.h>
#define N 10
int main(void)
{
int m[N] = { 3,6,1,9,2,5,5,3,2,1 };
int i, j, mp, tmp;
printf("ソート前:\n");
for (i = 0; i<N; i++) {
printf("%3d", m[i]);
puts("");
}
for (i = 0; i<N - 1; i++) {
for (j = i + 1; j < N; j++) {
if (m[j] < m[i]) {
tmp = m[i];
m[i] = m[j];
m[j] = tmp;
}
}
}
printf("ソート後:\n");
for (i = 0; i<N; i++) {
printf("%3d", m[i]);
puts("");
}
return 0;
}
Re: [初心者]配列、昇順について[急ぎ]
Posted: 2016年1月18日(月) 22:51
by Dixq (管理人)
ちなみに
×ご教授のほどよろしくお願いします。
○ご教示のほどよろしくお願いします。
です。
教授だと大学になってしまいます。
Re: [初心者]配列、昇順について[急ぎ]
Posted: 2016年1月18日(月) 23:12
by tk-xleader
アルゴリズムについて再度確認しましょう。
i=0から
(1) 配列mのi番目の要素以降の中で最小のもの(mp番目)を探索する。
(2) i番目の要素とmp番目の要素を交換する。
(3) iをインクリメントして、i=N-1(最後の一つ前)までそれを繰り返す。
というプログラム(アルゴリズムは選択ソート)を書きたいわけですよね。それでは、mpはi番目以降である(iが一番小さいのであればiそのもの)になるわけですから、mpのデフォルト値が1なのは「あれっ?」と思いませんか?
Re: [初心者]配列、昇順について[急ぎ]
Posted: 2016年1月18日(月) 23:39
by elims
Dixq (管理人) さんが書きました:mpってなんのためにつかうんですか?
以下のように無しじゃダメなんでしょうか?
コード:
#include<stdio.h>
#define N 10
int main(void)
{
int m[N] = { 3,6,1,9,2,5,5,3,2,1 };
int i, j, mp, tmp;
printf("ソート前:\n");
for (i = 0; i<N; i++) {
printf("%3d", m[i]);
puts("");
}
for (i = 0; i<N - 1; i++) {
for (j = i + 1; j < N; j++) {
if (m[j] < m[i]) {
tmp = m[i];
m[i] = m[j];
m[j] = tmp;
}
}
}
printf("ソート後:\n");
for (i = 0; i<N; i++) {
printf("%3d", m[i]);
puts("");
}
return 0;
}
そのコードでも実行ができますね・・・、ありがとうございます。
ご教示でした、日頃教授に送っているものでそのままうってしまいました。
Re: [初心者]配列、昇順について[急ぎ]
Posted: 2016年1月18日(月) 23:42
by elims
tk-xleader さんが書きました: アルゴリズムについて再度確認しましょう。
i=0から
(1) 配列mのi番目の要素以降の中で最小のもの(mp番目)を探索する。
(2) i番目の要素とmp番目の要素を交換する。
(3) iをインクリメントして、i=N-1(最後の一つ前)までそれを繰り返す。
というプログラム(アルゴリズムは選択ソート)を書きたいわけですよね。それでは、mpはi番目以降である(iが一番小さいのであればiそのもの)になるわけですから、mpのデフォルト値が1なのは「あれっ?」と思いませんか?
申し訳ありません。いかんせん勉強不足なもので(3)までは理解しているのですが、デフォルト値が1であるとなにがおかしいかわかりません。
変更したコードと共に教えていただけるとありがたいです。
Re: [初心者]配列、昇順について[急ぎ]
Posted: 2016年1月18日(月) 23:51
by tk-xleader
もう一度確認しますが、mpというのは、「i番目の要素以降の要素の中で最小のもの」の要素番号を指している必要がありますね?
mpが最初にとる値が1だとすると、i番目の要素が最も小さいときに、(2)で「要素番号が1の要素とiの要素を入れ替える」というコードを実行することになるのでは?
つまり、mp=1;のところをmp=i;に書き換えればいいのです。
Re: [初心者]配列、昇順について[急ぎ]
Posted: 2016年1月19日(火) 00:08
by elims
tk-xleader さんが書きました: もう一度確認しますが、mpというのは、「i番目の要素以降の要素の中で最小のもの」の要素番号を指している必要がありますね?
mpが最初にとる値が1だとすると、i番目の要素が最も小さいときに、(2)で「要素番号が1の要素とiの要素を入れ替える」というコードを実行することになるのでは?
つまり、mp=1;のところをmp=i;に書き換えればいいのです。
完全に見落としてました。。。 mp=i;ですね・・・
ありがとうございました。