見出し画像

選択ソートって実はこんなのでした!

間違っていた選択ソート

先日来、バブルソートはこんなのだ、選択ソートはあんなのだなどと書いてきましたが、こちらの記事のコメントで遊月さんからご指摘いただきました。

「それって、選択ソートと違うんじゃない?」

そう!
あれは選択ソートではなかったんです!orz

そして正しい選択ソート

改めて。
こちらが選択ソートです。

#include <stdio.h>
#include <stdlib.h>

int cnt = 0;
void sort(int *array, unsigned int size) {
  for (int k = 0; k < size; k++) printf("%d ", array[k]); 
  printf("\n");

  for (int i = 0; i < size - 1; i++) {
    int min = i;
    for (int j = i+1; j < size; j++) {
      if (array[min] > array[j]) {
        min = j;
      }
    }
    if (min != i) {
      int temp = array[min];
      array[min] = array[i];
      array[i] = temp;
	  cnt++;
 	  for (int k = 0; k < size; k++) printf("%d ", array[k]); 
  	  printf("\n");
    }
  }
  printf("sort swaped %d\n ", cnt);
  printf("\n");
}

int main() {
  int data[10] = {6, 3, 8, 9, 5, 4, 1, 7, 0, 2};

  unsigned int size = sizeof(data) / sizeof(data[0]);
  sort(data, size);

  return 0;
}

ついでに、実行結果はこちら。

6 3 8 9 5 4 1 7 0 2
0 3 8 9 5 4 1 7 6 2
0 1 8 9 5 4 3 7 6 2
0 1 2 9 5 4 3 7 6 8
0 1 2 3 5 4 9 7 6 8
0 1 2 3 4 5 9 7 6 8
0 1 2 3 4 5 6 7 9 8
0 1 2 3 4 5 6 7 8 9

数字の羅列だけでは面白くないので、ちょっと塗り絵してみました。
ピンクは後ろに移動した数字
青は前に移動した数字です。

選択ソートの数字の動き

ちなみに、前回までの「バブルソート風選択ソート」だとこんな感じ。

バブルソート風選択ソートの数字の動き

一目瞭然ですね。
かなり余分に数字が動いています。
「7」などは元の位置から動かなくていいものを、あっちに行ったりこっちに行ったりしています。
「でも、バブルソートよりはマシなのではないか」とも感じるのですが、バブルソートは、実は途中で止めることができます。常に全点検しているので一度も交換しなければそこでソート完了と判断できるのです。でも、このソートの場合はそれはできません。先頭のみしか比較していないので、一度も交換しなかったとしても、2番目、3番目がどうなるのか判断できないためです。

も一つついでに、バブルソートはこんな風になります。

バブルソートの数字の動き

今回の間違いについて

そもそもは、AI に聞いたことが発端でした。
AI を鵜呑みにしたわけではありません。
一応、Wikiも参照したのですが、先頭の日本語解説だけで判断しました。後方に記載されているアルゴリズムを見れば間違えなかったものを。手を抜くとこういうことになるという、いい見本です。

謝辞

遊月さん、ご指摘ありがとうございました。
大変、助かりました。
これからもよろしくお願いします。



この記事が気に入ったらサポートをしてみませんか?