(答案再提出)C言語教室 第26回 - いろいろなソート - バブルソートアルゴリズム
我が敬愛する姉弟子のAyumiさんとのやり取りの中で、典型的な”バブルソートアルゴリズム”を使っていたと信じていた私の昨日の答案が、実はそうではなく、”選択ソートアルゴリズム”と呼ばれるものである可能性が出てきました。課題はバブルソートを使うことが要件でしたので、これこそはバブルソートアルゴリズムで間違い無いだろうというロジックに変更して、再提出します。
Ayumiさんとのやりとりは、いつも何か新しい発見があります。有難うございます!
※ 実際のところ、先に提示したアルゴリズムをバブルソートとして解説しているWebサイトもありますし、実際のところどうなんでしょうね。
課題
ソースコード
データを置換する関数、データを一覧出力する関数を新たに設けました。
/**********************************************************************
lesson26 Sorts an array of strings with bubble sort
by Akio van der Meer
[変更履歴]
(無印) 記事初投稿時のコード
r1 関数ポインタを利用
r1.1 選択ソートから、バブルソートにアルゴリズムを修正
**********************************************************************/
#include <stdio.h>
#include <string.h>
int ascending_order(char *a, char *b) {
return strcmp(a, b) > 0;
}
int descending_order(char *a, char *b) {
return strcmp(a, b) < 0;
}
typedef int(*FUNC)(char*, char*);
void swap_data(char **a, char **b) {
char *temp = *a;
*a = *b;
*b = temp;
}
void bubble_sort(char * array[], unsigned int size, FUNC f) {
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - i - 1; j++) {
if (f(array[j], array[j + 1])) {
swap_data(&array[j], &array[j + 1]);
}
}
}
}
void print_data(char *array[], unsigned int size) {
for (int i = 0; i < size; i++) {
printf("%s\n", array[i]);
}
}
int main() {
char *weekday[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
unsigned int size = 7;
printf("\nAscending order ---\n");
bubble_sort(weekday, size, ascending_order);
print_data(weekday, size);
printf("\nDescending order ---\n");
bubble_sort(weekday, size, descending_order);
print_data(weekday, size);
return 0;
}
実行結果
当然ながら、昨日と全く同じです。
jm3nrhMac-mini-:c akio$ gcc lesson26.r1.1.c
jm3nrhMac-mini-:c akio$ ./a.out
Ascending order ---
Friday
Monday
Saturday
Sunday
Thursday
Tuesday
Wednesday
Descending order ---
Wednesday
Tuesday
Thursday
Sunday
Saturday
Monday
Friday
ChatGPT様に聞いてみた
『次のコードの優れた点を述べよ。』
そうそうそう!
ここまで読んでいただき、有難うございました。
この記事が参加している募集
これまでの収益は全て、それを必要としておられる方々へ、支援機関を通して寄付させていただきました。この活動は今後も継続したいと思っています。引き続きよろしくお願いいたします。