🖥️

【C言語入門の次】 第08回 選択ソート

に公開

https://youtu.be/_czJwWnUch0

四国めたん
\textcolor{pink}{四国めたん: }教師役ですわ

ずんだもん
\textcolor{lime}{ずんだもん: }生徒役なのだ

\footnotesize \textcolor{pink}{四国めたん:} こんにちは。四国めたんです

\footnotesize \textcolor{lime}{ずんだもん:} ずんだもんなのだ。こんにちはなのだ

\footnotesize \textcolor{pink}{四国めたん:} 今回も ソート のアルゴリズムについてお話ししますわ

\footnotesize \textcolor{lime}{ずんだもん:} りょうかいなのだ

\footnotesize \textcolor{pink}{四国めたん:} 今回は 選択ソート についてお話ししますわ

\footnotesize \textcolor{lime}{ずんだもん:} よろしくなのだ

選択ソート

\footnotesize \textcolor{pink}{四国めたん:} まず、 選択ソート の仕組みについてお話ししますわ

\footnotesize \textcolor{lime}{ずんだもん:} うむ

\footnotesize \textcolor{pink}{四国めたん:} まず最初に配列にデータを用意しますわ

\footnotesize \textcolor{lime}{ずんだもん:} どのようなデータなのだ?

\footnotesize \textcolor{pink}{四国めたん:} データは比較できればOKなので、整数や浮動小数点数だけではなく、文字列などでも問題ありませんわ

\footnotesize \textcolor{lime}{ずんだもん:} りょうかいなのだ

\footnotesize \textcolor{pink}{四国めたん:} 今回は整数を例に取りますわね

\footnotesize \textcolor{lime}{ずんだもん:} うむ

\footnotesize \textcolor{pink}{四国めたん:} まず、ソート前の配列には、整数がバラバラに入っているとしますわ

\footnotesize \textcolor{lime}{ずんだもん:} ふむ

交換

\footnotesize \textcolor{pink}{四国めたん:} 最初は全データを順番に確認していき、最小のデータを見つけますわ

\footnotesize \textcolor{lime}{ずんだもん:} 例では、インデックス4の1が最小値なのだ

\footnotesize \textcolor{pink}{四国めたん:} はい、この最小値のデータを配列の先頭(インデックス0)のデータと交換しますわ

\footnotesize \textcolor{lime}{ずんだもん:} これでインデックス0が最小値になったのだ

\footnotesize \textcolor{pink}{四国めたん:} 次に、インデックス1以下のデータで同じように最小値を探しますわ

\footnotesize \textcolor{lime}{ずんだもん:} 例では、インデックス2の2が最小値なのだ

\footnotesize \textcolor{pink}{四国めたん:} この最小値のデータを配列の先頭(インデックス1)のデータと交換しますわ

\footnotesize \textcolor{lime}{ずんだもん:} これでインデックス1が先頭の1を除いた最小値になったのだ

\footnotesize \textcolor{pink}{四国めたん:} これを繰り返せば、配列中のデータを順番に並べることができますわ

\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ

選択ソートの実装

\footnotesize \textcolor{pink}{四国めたん:} それでは 選択ソート を実装してみましょう

#include <stdio.h>

void print_data(int data[], int size) {
  for (size_t i = 0; i < size; i++) {
    printf("%d ", data[i]);
  }
  printf("\n");
  return;
}

void selection_sort(int data[], int size) {
  for (int i = 0; i < size - 1; i++) {
    int min_idx = i;
    for (int j = i + 1; j < size; j++) {
      if (data[j] < data[min_idx]) {
        min_idx = j;
      }
    }
    int temp = data[min_idx];
    data[min_idx] = data[i];
    data[i] = temp;
    print_data(data, size);
  }
  return;
}

int main(int argc, char* argv[]) {
  int data[] = {4, 6, 2, 5, 1, 3};
  int size = sizeof(data) / sizeof(int);
  print_data(data, size);
  selection_sort(data, size);
  return 0;
}

\footnotesize \textcolor{pink}{四国めたん:} まず、print_dataは、ソートの途中で配列のデータの並びを確認するための関数ですわ

\footnotesize \textcolor{lime}{ずんだもん:} これでソート途中の配列の並びを確認できるのだ

\footnotesize \textcolor{pink}{四国めたん:} メイン関数では配列にデータを準備しますわ

\footnotesize \textcolor{lime}{ずんだもん:} 初期値の整数の並びは適当なのだ

\footnotesize \textcolor{pink}{四国めたん:} そしてselection_sort関数で配列中のデータをソートしますわ

\footnotesize \textcolor{lime}{ずんだもん:} selection_sort関数は2重のループになっているのだ

\footnotesize \textcolor{pink}{四国めたん:} はい、外側のループは最小値を探す最初のインデックスを設定しますわ

\footnotesize \textcolor{lime}{ずんだもん:} ふむふむ

\footnotesize \textcolor{pink}{四国めたん:} 内側のループでは、現在の最小値とjによる指定の要素を比較しますわ

\footnotesize \textcolor{pink}{四国めたん:} そして、指定の要素の整数値のほうが小さい場合には最小値のインデックスを更新しますわ

\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ

\footnotesize \textcolor{pink}{四国めたん:} 内側のループで最小値を確認後、外側のループのiで指定される要素と最小値の要素のデータを交換しますわ

\footnotesize \textcolor{lime}{ずんだもん:} りょうかいなのだ

\footnotesize \textcolor{pink}{四国めたん:} それでは実行してみましょう

選択ソート

\footnotesize \textcolor{lime}{ずんだもん:} 徐々にソートされていくのがわかるのだ

まとめ

\footnotesize \textcolor{pink}{四国めたん:} お疲れさまでした

\footnotesize \textcolor{lime}{ずんだもん:} おつかれさまなのだ

\footnotesize \textcolor{pink}{四国めたん:} 以上で 選択ソート を終わりますわ

\footnotesize \textcolor{pink}{四国めたん:} なお、 選択ソートバブルソート 程ではありませんが、かなり遅い部類のソートですわ

\footnotesize \textcolor{lime}{ずんだもん:} そうなのか?

\footnotesize \textcolor{pink}{四国めたん:} ただ、アルゴリズムとしては、人が手で並べ替える場合によくおこなう方法ですので、判り易いと思いますわ

\footnotesize \textcolor{lime}{ずんだもん:} たしかに...

Discussion