アルゴリズムの知識をブラッシュアップしたかったので、次の本を使用しています:一言で言えばアルゴリズム
65 ページに、挿入ソートのアルゴリズムが掲載されています。アルゴリズムは非常に単純で、理解するのは簡単です。私の問題は、彼らがそれを実装した方法から来ています。私は主にマネージ言語 (C#/Java) で作業しているため、ポインタのカンフーはちょっとさびています。彼らが提供するコードサンプルは次のとおりです。
void sortPointers(void **ar, int n, int(*cmp)(const void *, const void *)) {
int j;
for(j = 1; j < n; j++) {
int i = j - 1;
void* value = ar[j];
while(i >= 0 && cmp(ar[i], value) > 0) {
ar[i+1] = ar[i];
i--;
}
ar[i+1] = value;
}
}
実際の例を得るために追加したものは次のとおりです。
int cmp(const void* t1, const void* t2) {
if(t1 > t2) {
return 1;
}
else if(t2 > t1) {
return -1;
}
else {
return 0;
}
}
void main() {
int values[] = { 51, 3, 5, 60, 9, 2, 7};
sortPointers((void**)values, 7, cmp);
for(int i = 0; i < 7; i++) {
cout << values[i] << " ";
}
}
これは機能しますが、理由と方法が完全にはわかりませんか? また、メイン関数で (void **) キャストが機能するのはなぜですか? ダブル ポインター インダイレクションを使用したのはなぜですか?
学校に戻ると、複数の間接参照を使用した唯一の場所は、多次元配列を動的に割り当てるときでした。私が知っている唯一の他の用途は、メソッドに渡すポインターが保持するアドレスを変更できる必要がある場合です。
さらに、コードを次のように変更したところ、問題なく動作しました。
void sortPointers2(int* arr, int n, int (*cmp)(int, int)) {
int j;
for(j = 1; j < n; j++) {
int i = j - 1;
int value = arr[j];
while(i >= 0 && cmp(arr[i], value) > 0) {
arr[i+1] = arr[i];
i--;
}
arr[i+1] = value;
}
}
int cmp2(int t1, int t2) {
if(t1 > t2) {
return 1;
}
else if(t2 > t1) {
return -1;
}
else {
return 0;
}
}
void main() {
int values[] = { 51, 3, 5, 60, 9, 2, 7};
sortPointers2(values, 7, cmp2);
for(int i = 0; i < 7; i++) {
cout << values[i] << " ";
}
}
基本的で明白な何かが欠けていると確信しています。これを読んで、1つか2つのアイデアに参加してくれた人に感謝します. 追加の詳細が必要な場合、または用語を台無しにした場合はお知らせください。
編集: 最初の cmp 関数のタイプミスを修正