

配列の中身を入れ替える方法をどなたかおしえてください。下のプログラムはちゃんと実行されるんですが、いまいち納得できません。
特に・・・↓↓
void sort(int a[])
{
int x,y,z,min;
for(x=0;x<10;x++)
{
min=x;
for(y=x;y<10;y++)
{
if(a[min]>a[y])
{
min=y;
}
}
z=a[min];
a[min]=a[x];
a[x]=z;
}
}
上の部分でなぜfor文を2回使うのか?2回目のfor文のところはなぜ
y=xなのか?0ではいけないのか?よくわかりません。一番最後の入れ替え作業のところは納得できたんですが、for文のところがよくわからないのでどなたか分かる方教えてください!
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void sort(int a[])
{
int x,y,z,min;
for(x=0;x<10;x++)
{
min=x;
for(y=x;y<10;y++)
{
if(a[min]>a[y])
{
min=y;
}
}
z=a[min];
a[min]=a[x];
a[x]=z;
}
}
int main(int argc, char* argv[])
{
int a[10],b,c;
srand((unsigned)time(NULL));
for(b=0;b<10;b++)
{
a[b]=rand();
c=a[b];
printf("a[%d]=%d\n",b,a[b]);
}
sort(a);
for(b=0;b<10;b++)
{
printf("小さい順a[%d]=%d\n",b,a[b]);
}
return 0;
}
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
>いまいち納得できません。
・10区画に仕切られた、左右に横長な箱の中に、1区画1個ずつ、大きさの不揃いなリンゴが入っています。
・リンゴには、重さの書かれたシールが貼ってあります。
これを「軽い順」に左区画(一番目とします)から入れ替える、としましょう(最終結果:最も軽いリンゴが一番目の区画、最も重いリンゴが十番目の区画)。
(片手のみで・・)
1.「仮の最も軽い」リンゴとして、一番目の区画(のリンゴ)とします。
2.このリンゴより軽いものがあるか、二番目以降(◆)の区画に入っているリンゴ9つと比較します。
3.2.の途中で「仮の最も軽い」リンゴより軽いリンゴがあった場合、その区画を「メモ」します。
4.3.では、「仮の最も軽い」値も更新されます( a[ min ] )。
5.2~4で、「真に最も軽い」リンゴが入っている区画が確定します。
6.「真に最も軽い」リンゴを区画から出して、別途用意したお皿に置きます。
7.空になった区画に、当初一番目の区画に入っていたリンゴを入れます。
8.一番目の区画は空ですので、ここにお皿に待避した「真に最も軽い」リンゴを入れます。
・これでようやく、「最も軽いリンゴが一番目の区画」ができました(ソート作業の1/10)。
・次は、この「一番目の区画」に入った確定リンゴを除外し、二番目の区画以降を上の手順に準じて求めます。
void sort( int a[] )
{
int x, y, z, min;
for( x = 0; x < ( 10 - 1 ); x++ ){ // 9個まで確定すれば残り1つも確定
min = x; // 1.
for( y = ( x + 1 ); y < 10; y++ ){ // 2.
if( a[ y ] < a[ min ] ) min = y; // 3.4.5.
}
z = a[ min ]; // 6.「両手」が使えるシステムなら??
a[ min ] = a[ x ]; // 7.
a[ x ] = z; // 8.
}
}
>上の部分でなぜ for文を2回使うのか?
・「順位」の意味合いの for文と、「中身をサーチ」の意味合いの for文と考えれば・・。
>2回目の for文のところはなぜ y = x なのか?0ではいけないのか?
・「確定」したものを除外しないと同じものが・・。 ← 2.◆
なお、上のソースのように、y = ( x + 1 ); が無駄がないかな。
No.2
- 回答日時:
選択ソート(セレクションソート)のようなので下記ページを見てください。
アルゴリズムとデータ構造編 第3章 選択ソート
http://www.geocities.jp/ky_webid/algorithm/003.h …
> 2回目のfor文のところはなぜy=xなのか?0ではいけないのか?
すでにソート済みの部分が最小値探索範囲に含まれてしまうからです。
0にしてしまうとソートできません。
No.1
- 回答日時:
> 上の部分でなぜfor文を2回使うのか?
1回ではソートが完了しません。
> 2回目のfor文のところはなぜy=xなのか?0ではいけないのか?
いけなくはありませんが、無駄です。
0~x-1まではすでにソートが終わってますから。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vbでDataTableの抽出コピー
-
PHP MySQL自動連番で削除された...
-
C言語において、 配列要素をひ...
-
C言語 配列の長さの上限
-
C++で、メンバもヒープに確保さ...
-
ポインタに ~0を入れること
-
x64環境で連続4GB以上のメモリ...
-
VBを2008を用いてCSVを取り込む...
-
Visual Basic 6.0 と8.0と2015
-
配列を返り値、でエラー
-
9枚の写真がA4 1枚に印刷できま...
-
aspでユーザー定義の構造体を作...
-
配列で格納したものをmsgboxで...
-
c言語
-
【速いブラインドタッチ】手を...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
RGB値を画像(PNG・BMPJPEGなど)...
-
関数のパラメタ(C++)
-
関数から配列を返すには?
-
CopyMemory()をmemcpy()に書き...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
C# DataGridView のヘッダーセ...
-
あるディレクトリ内のファイル...
-
VBA基本構文の作り方 2列の...
-
VB.NETでファイル名順にファイ...
-
ファイル名「1.jpg ~10.jpg~...
-
C# DataTableの行をソートしてD...
-
Excelですべての組合せ(重複組...
-
DataGridViewソート時に先頭行...
-
構造体配列のソート
-
バブルソートとセレクションソ...
-
VB2005 符号を踏まえた降順ソ...
-
DataGridViewの複数列を連動し...
-
Verilog でのソートの仕方
-
datagridviewの並べ替え
-
2次元配列を複数項目でソートし...
-
VBScriptで重複レコードを削除...
-
GridViewで列のソートを無効に...
-
4番目以降の並べ替え
-
DataGridViewの昇順降順。
おすすめ情報