「任意の」並べ替えアルゴリズム、または「効率的な」並べ替えアルゴリズムが必要ですか?
簡単にするために、簡単ではあるが効率的ではないソート アルゴリズムを実装する方法を紹介します。そのdouble for
方法です!! 次に、同じアイデアで、他の効率的なアルゴリズム (シェルやクイックソートなど) に変更できます。
数値の場合、次のように配列を順番に並べることができます (おそらくご存じのとおり)。
int intcmp(int a, int b) {
return (a < b)? -1: ((a > b)? +1: 0);
}
int main(void) {
int a[5] = {3, 4, 22, -13, 9};
for (int i = 0; i < 5; i++) {
for (int j = i+1; j < 5; j++)
if (intcmp(a[i], a[j]) > 0) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
printf("%d ", a[i]);
}
}
現在変更されている唯一のことは、整数の代わりに文字列があることです。したがって、文字列の配列を考慮する必要があります。
char *a[] = {"Florida", "Oregon", "Califoria", "Georgia"};
temp
次に、 の型をに変更する必要がありchar*
、
最後に のstrcmp()
代わりに関数を配置しますintcmp()
。
この関数strcmp(s1, s2)
(< string.h > から) は、s1 が s2 より「小さい」文字列の場合は < 0 を返し、s1 が s2 と「等しい」場合は == 0 を返し、それ以外の場合は > 1 を返します。
プログラムは次のようになります。
#include <stdio.h>
#include <string.h>
int main(void) {
char *a[] = {"Florida", "Oregon", "Califoria", "Georgia"};
for (int i = 0; i < 4; i++) {
for (int j = i+1; j < 4; j++)
if (strcmp(a[i], a[j]) > 0) {
char* temp = a[i];
a[i] = a[j];
a[j] = temp;
}
printf("%s ", a[i]);
}
getchar();
return 0;
}
printf()
文については、文字列を適切に表示するために , に 変更"%d "
したことに注意してください。"%s "
最後のコメント:クイック ソートのようなより良いアルゴリズムをプログラムする場合、比較するデータの種類に関係なく、アルゴリズムは同じであるため、比較関数を変更するだけで十分です。
注意:私は「トリッキーな」方法を使用しました。ご覧のとおり、変数を string へのポインターa
として。初期化子は文字列の定数配列を取得し、それを使用して変数を初期化しました。変数は、正確に 4 つの文字列へのポインターの配列として安全に処理およびインデックス付けできるようになりました。
これが、「スワップ」が double-for アルゴリズムで正常に機能する理由です。文字列 全体ではなく、メモリ アドレスがスワップされます。a
a