挿入ソート、バブルソート、選択ソートの手順が理解できません。
どなたか教えてください。
ソースコードも提示していただけると幸いです。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
動画見るのが一番いいと思います。
投稿2018/04/15 04:54
総合スコア5223
0
ベストアンサー
こんにちは、
まず初めに
他の方もおっしゃっていますが本当は自分である程度は考える必要があります。
もちろん人から教わるのも一つの勉強ですが、自分で考え理解することで初めて自分のものになります。
プログラミングは頭で考えるのが約80%、考えたことをコードに落とし込むのが約20%といわれています。
今回は、私が実際書いたコードを使って説明しますが、ひとつひとつ理解して進んでください。
1.挿入ソート
全てのデータの中で0番目からi番目までのうちi番目より大きい数字があったら,その2つを入れ替えるソートです。
最初はi = 0 その次はi = 1と増え それぞれ0からiまでの中で処理をするので、2重for文を使いましょう。
C++
1for(i = 0; i < MAX_NUMBER; i++){ 2 for(j = 0; j <= i; j++){ 3 if(data[i] < data[j]){ 4 tmp = data[i]; //2つのデータを入れ替える 5 data[i] = data[j]; 6 data[j] = tmp; 7 } 8 } 9}
その都度、2つのデータを比べ右のほうが大きかったら、2つのデータを入れ替えます。
<サンプルコード>
C
1#include <stdio.h> 2#include <stdlib.h> 3 4#define MAX_NUMBER 10 5 6int main(void){ 7 8 int data[MAX_NUMBER] = {8,4,5,7,9,1,13,2,15,6}; 9 int i,j; 10 int tmp; 11 for(i = 0; i < MAX_NUMBER; i++){ 12 for(j = 0; j <= i; j++){ 13 if(data[i] < data[j]){ 14 tmp = data[i]; 15 data[i] = data[j]; 16 data[j] = tmp; 17 } 18 } 19 } 20 for(i = 0; i < MAX_NUMBER; i++){ 21 printf("%d ",data[i]); 22 } 23 return 0; 24} 25
2.バブルソート
3つの中では一番わかりやすいと思います。
隣り合った2つのデータを比べ、右のほうが大きかったら入れ替えます。
ここで、重要なのは一番右には最も大きいデータが来るということです。(最大となるものから右に寄る)
そして、その次は、一番右以外でまた入れ替え作業をします。
データがN個のとき最初は,0番目からN - 1番目
その次は0番目からN - 2番目... となるのでここの2重for文は、
C++
1for(i = N - 1; i >= 0; i--){ 2 for(j = 0; j < i; j++){ 3 } 4}
となります。実際の処理内容は先ほどと あまり変わらないので、説明は省略します。
<サンプルコード>
C++
1#include <stdio.h> 2 3#define MAX_NUMBER 10 4 5int main(void) 6{ 7 int data[MAX_NUMBER] = {8,4,5,7,9,1,13,2,15,6}; 8 int i,j; 9 int tmp; 10 for(i = MAX_NUMBER - 1; i >= 0; i--){ 11 for(j = 0; j < i; j++){ 12 if(data[j] > data[j + 1]){ 13 tmp = data[j]; 14 data[j] = data[j + 1]; 15 data[j + 1] = tmp; 16 } 17 } 18 } 19 for(i = 0; i < MAX_NUMBER; i++){ 20 printf("%d ",data[i]); 21 } 22 return 0; 23}
3.選択ソート
これは説明も実際のコードも少し複雑になります。
最初は0番目だけ、その次は0番目から1番目...のように
0番目からi番目までの中で最小値を求め、その最小値を一番左にあるデータと入れ替えます。
ここで重要なのでは,最小値だけではなく、最小値がもともとあった場所を記憶する必要があるということです。
<サンプルコード>
C++
1#include <stdio.h> 2 3#define MAX_NUMBER 10 4 5int main(void) 6{ 7 int data[MAX_NUMBER] = {8,4,5,7,9,1,13,2,15,6}; 8 int i,j; 9 int tmp,tmp_posi; 10 int tmp2; 11 int position = 0; 12 for(i = 0; i < MAX_NUMBER; i++){ 13 tmp = data[i]; 14 for(j = i; j < MAX_NUMBER; j++){ 15 if(tmp > data[j]){ 16 tmp = data[j]; 17 tmp_posi = j; 18 } 19 } 20 tmp2 = data[position]; 21 data[position] = tmp; 22 data[tmp_posi] = tmp2; 23 position++; 24 } 25 for(i = 0; i < MAX_NUMBER; i++){ 26 printf("%d ",data[i]); 27 } 28 return 0; 29}
最後に
最初にも言いましたが、やはり自分で考えることが大切です。
2重for文の場合、中でどんな処理が行われているか最初はわからなくて混乱するかもしれません。
「i = 0 の時、jが0からMAX_NUMBERまで動くとこのような処理が行われる」など、
実際に、配列の番号のところに数字を代入して、確認することで理解が深まるでしょう。
地道な作業かもしれませんが、プログラミングを学ぶ上で大切なことだと思います。
投稿2018/04/15 13:07
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/04/15 13:10
退会済みユーザー
2018/04/15 13:11 編集
2018/04/15 22:23
2018/04/15 23:52 編集
2018/04/15 23:55
2018/04/15 23:58
2018/04/16 06:08
2018/04/16 06:14
退会済みユーザー
2018/04/16 06:15
2018/04/16 06:15
2018/04/16 06:17
退会済みユーザー
2018/04/16 06:22
2018/04/16 09:24
2018/04/30 00:53
0
ググれば出てくるはずですが。
Qiita - 「ソート」を極める! 〜 なぜソートを学ぶのか 〜
また、当たり前の話ですが、理解した上で書かないとなんの得も無いということをお忘れなく。
投稿2018/04/15 04:53
総合スコア35660
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/15 04:56
2018/04/15 04:58
2018/04/15 04:59
2018/04/15 05:00
2018/04/15 08:14