[初心者]配列、昇順について[急ぎ]

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

[初心者]配列、昇順について[急ぎ]

#1

投稿記事 by elims » 4年前

初投稿になります。
以下のように数値を昇順に並び替えるというものなのですが、実行したところ、なぜか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;
}

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: [初心者]配列、昇順について[急ぎ]

#2

投稿記事 by Dixq (管理人) » 4年前

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;
}

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: [初心者]配列、昇順について[急ぎ]

#3

投稿記事 by Dixq (管理人) » 4年前

ちなみに
×ご教授のほどよろしくお願いします。
○ご教示のほどよろしくお願いします。
です。
教授だと大学になってしまいます。

アバター
tk-xleader
記事: 153
登録日時: 9年前
連絡を取る:

Re: [初心者]配列、昇順について[急ぎ]

#4

投稿記事 by tk-xleader » 4年前

 アルゴリズムについて再度確認しましょう。

i=0から
(1) 配列mのi番目の要素以降の中で最小のもの(mp番目)を探索する。
(2) i番目の要素とmp番目の要素を交換する。
(3) iをインクリメントして、i=N-1(最後の一つ前)までそれを繰り返す。

 というプログラム(アルゴリズムは選択ソート)を書きたいわけですよね。それでは、mpはi番目以降である(iが一番小さいのであればiそのもの)になるわけですから、mpのデフォルト値が1なのは「あれっ?」と思いませんか?

elims

Re: [初心者]配列、昇順について[急ぎ]

#5

投稿記事 by elims » 4年前

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;
}
そのコードでも実行ができますね・・・、ありがとうございます。
ご教示でした、日頃教授に送っているものでそのままうってしまいました。

elims

Re: [初心者]配列、昇順について[急ぎ]

#6

投稿記事 by elims » 4年前

tk-xleader さんが書きました: アルゴリズムについて再度確認しましょう。

i=0から
(1) 配列mのi番目の要素以降の中で最小のもの(mp番目)を探索する。
(2) i番目の要素とmp番目の要素を交換する。
(3) iをインクリメントして、i=N-1(最後の一つ前)までそれを繰り返す。

 というプログラム(アルゴリズムは選択ソート)を書きたいわけですよね。それでは、mpはi番目以降である(iが一番小さいのであればiそのもの)になるわけですから、mpのデフォルト値が1なのは「あれっ?」と思いませんか?

申し訳ありません。いかんせん勉強不足なもので(3)までは理解しているのですが、デフォルト値が1であるとなにがおかしいかわかりません。

変更したコードと共に教えていただけるとありがたいです。

アバター
tk-xleader
記事: 153
登録日時: 9年前
連絡を取る:

Re: [初心者]配列、昇順について[急ぎ]

#7

投稿記事 by tk-xleader » 4年前

 もう一度確認しますが、mpというのは、「i番目の要素以降の要素の中で最小のもの」の要素番号を指している必要がありますね?
 mpが最初にとる値が1だとすると、i番目の要素が最も小さいときに、(2)で「要素番号が1の要素とiの要素を入れ替える」というコードを実行することになるのでは?

 つまり、mp=1;のところをmp=i;に書き換えればいいのです。

elims

Re: [初心者]配列、昇順について[急ぎ]

#8

投稿記事 by elims » 4年前

tk-xleader さんが書きました: もう一度確認しますが、mpというのは、「i番目の要素以降の要素の中で最小のもの」の要素番号を指している必要がありますね?
 mpが最初にとる値が1だとすると、i番目の要素が最も小さいときに、(2)で「要素番号が1の要素とiの要素を入れ替える」というコードを実行することになるのでは?

 つまり、mp=1;のところをmp=i;に書き換えればいいのです。
完全に見落としてました。。。 mp=i;ですね・・・
ありがとうございました。

閉鎖

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