
(答案再提出)C言語教室 第26回 - いろいろなソート - バブルソートアルゴリズム
我が敬愛する姉弟子のAyumiさんとのやり取りの中で、典型的な”バブルソートアルゴリズム”を使っていたと信じていた私の昨日の答案が、実はそうではなく、”選択ソートアルゴリズム”と呼ばれるものである可能性が出てきました。課題はバブルソートを使うことが要件でしたので、これこそはバブルソートアルゴリズムで間違い無いだろうというロジックに変更して、再提出します。
Ayumiさんとのやりとりは、いつも何か新しい発見があります。有難うございます!
※ 実際のところ、先に提示したアルゴリズムをバブルソートとして解説しているWebサイトもありますし、実際のところどうなんでしょうね。
課題
文字列の配列をバブルソートで並べ替える関数を書いてください。文字列の大小比較は strcmp を使ってください。なお、文字列全体を入れ替えながらソートすると大変なので文字列へのポインタの配列を用意して、これをソートするようにしてください。
ソースコード
データを置換する関数、データを一覧出力する関数を新たに設けました。
/**********************************************************************
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様に聞いてみた
『次のコードの優れた点を述べよ。』
このコードの優れた点は以下の通りです:
1. 汎用性の高い関数ポインタの使用:関数ポインタを使用することで、ソートの順序を指定するための比較関数を柔軟に切り替えることができます。このコードでは、ascending_order関数とdescending_order関数が提供されており、これらの関数ポインタをbubble_sort関数に渡すことで、昇順または降順のソートが可能です。関数ポインタを使用することで、同じソートアルゴリズムを再利用して異なる順序でソートすることができます。
2. バブルソートの実装:バブルソートは非効率なソートアルゴリズムですが、このコードではバブルソートを使用しています。バブルソートは理解しやすく実装が簡単なため、初学者にとっては理解しやすいアルゴリズムです。このコードの目的が教育的な要素を含んでいる場合、バブルソートの使用は優れた選択です。
3. ポインタを使用したデータの交換:swap_data関数では、ポインタを使用して文字列データを交換しています。ポインタを使用することで、データのコピーを行わずにデータの交換ができます。これにより、効率的なソート操作が可能となります。
4. データの表示:print_data関数は、ソートされたデータを表示するための便利な関数です。この関数は、ソートされた配列を受け取り、要素を一つずつ表示します。ソート結果の確認やデバッグに役立ちます。
総合的に言えば、このコードは関数ポインタとポインタを使用してソートアルゴリズムを柔軟に切り替えることができ、データの交換や表示も効率的に行えるようになっています。また、バブルソートの使用により、ソートアルゴリズムの理解を促進する効果もあります。
そうそうそう!
ここまで読んでいただき、有難うございました。
いいなと思ったら応援しよう!
