配列の中身を入れ替える方法をどなたかおしえてください。下のプログラムはちゃんと実行されるんですが、いまいち納得できません。
特に・・・↓↓
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミングを教えて欲しいです。 配列aは、int a[9]={7,6,12,8,3,5,10,9 4 2022/12/19 23:27
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
ファイル名「1.jpg ~10.jpg~...
-
C# DataGridView のヘッダーセ...
-
C# DataTableの行をソートしてD...
-
VB.NETでファイル名順にファイ...
-
構造体配列のソート
-
VB.net データセットからのCSV...
-
excel VBA の条件をつけての列...
-
リスト構造のソートで悩んでま...
-
csvファイル内にてソートす...
-
DataGridViewの複数列を連動し...
-
構造体配列の並べ替え
-
小さい順
-
主キーソート(キーの優先順位...
-
EXCEL VBAのソートについて
-
VBA ソート機能について
-
2次元配列を複数項目でソートし...
-
VBA基本構文の作り方 2列の...
-
n個の要素で出来る順列組み合...
-
qsortについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
VB.NETでファイル名順にファイ...
-
ファイル名「1.jpg ~10.jpg~...
-
excel VBA の条件をつけての列...
-
リスト構造のソートで悩んでま...
-
C# DataGridView のヘッダーセ...
-
DataGridViewの複数列を連動し...
-
文字列をソートする方法
-
C# DataTableの行をソートしてD...
-
C言語・要素除去
-
Excelですべての組合せ(重複組...
-
VBA基本構文の作り方 2列の...
-
列のどこをクリックしてもソー...
-
excel VBA リストビューの行...
-
あるディレクトリ内のファイル...
-
コレクションの数値をSortで並...
-
数字文字列のソート方法
-
VBScriptで重複レコードを削除...
-
2次元配列を複数項目でソートし...
-
10個の整数を入力して小さい順...
おすすめ情報