アプリ版:「スタンプのみでお礼する」機能のリリースについて

配列の中身を入れ替える方法をどなたかおしえてください。下のプログラムはちゃんと実行されるんですが、いまいち納得できません。
特に・・・↓↓
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件)

>いまいち納得できません。



・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 ); が無駄がないかな。
    • good
    • 0

> ソート済みの部分が最小値探索範囲に含まれてしまう



...ですね。失礼しました。
    • good
    • 1

選択ソート(セレクションソート)のようなので下記ページを見てください。



アルゴリズムとデータ構造編 第3章 選択ソート
http://www.geocities.jp/ky_webid/algorithm/003.h …

> 2回目のfor文のところはなぜy=xなのか?0ではいけないのか?
すでにソート済みの部分が最小値探索範囲に含まれてしまうからです。
0にしてしまうとソートできません。
    • good
    • 0

> 上の部分でなぜfor文を2回使うのか?



1回ではソートが完了しません。

> 2回目のfor文のところはなぜy=xなのか?0ではいけないのか?

いけなくはありませんが、無駄です。
0~x-1まではすでにソートが終わってますから。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!