

配列の中身を入れ替える方法をどなたかおしえてください。下のプログラムはちゃんと実行されるんですが、いまいち納得できません。
特に・・・↓↓
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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETでファイル名順にファイ...
-
C# DataGridView のヘッダーセ...
-
System.IO.Directory.GetFiles...
-
C言語・要素除去
-
C# DataTableの行をソートしてD...
-
数字文字列のソート方法
-
mysqlで日本語の並び替え
-
int num[10]という配列に、適当...
-
クイックソートしながら重複要...
-
VBScriptで配列のソートをする...
-
DirectoryInfo型配列ソート(C#)
-
ファイル名「1.jpg ~10.jpg~...
-
C# DataTable ソートについて
-
VB6 2つのListBoxをソート
-
listboxの並び替え
-
配列の問題
-
DataGridViewのソートを止めたい
-
(VBA) Dir 関数で取得するファ...
-
C言語について
-
C# ArrayListを二次元配列のよ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
C# DataGridView のヘッダーセ...
-
VB.NETでファイル名順にファイ...
-
C# DataTableの行をソートしてD...
-
C言語・要素除去
-
配列の問題
-
VBA基本構文の作り方 2列の...
-
あるディレクトリ内のファイル...
-
Excelですべての組合せ(重複組...
-
n番目に大きい数を求めるアル...
-
2次元配列を複数項目でソートし...
-
ファイル名「1.jpg ~10.jpg~...
-
クイックソートしながら重複要...
-
C# ArrayListを二次元配列のよ...
-
csvファイル内にてソートす...
-
C言語について
-
プログラミングのわかるサイト
-
昇順ソート
-
int num[10]という配列に、適当...
-
EXCEL VBAのソートについて
おすすめ情報