プリンストンアルゴリズムコースを開始したばかりで、次のようにCで非常に基本的なクイック検索アルゴリズムを実装しようとしました-
#include <stdio.h>
void find(int *, int, int);
void unite(int *, int, int);
int main() {
int arr[10], i, n1, n2, opt;
char ch;
for (i = 0; i < 10; i++)
arr[i] = i;
do {
printf("1. Find\n2. Union\n");
scanf("%d", &opt);
if (opt == 1) {
scanf("%d,%d", &n1, &n2);
find(arr, n1, n2);
}
if (opt == 2) {
scanf("%d,%d", &n1, &n2);
unite(arr, n1, n2);
}
for (i = 0; i < 10; i++)
printf("%d ", arr[i]);
printf("Continue? (Y/N)");
getchar();
scanf("%c", &ch);
} while (ch == 'Y');
}
void find(int *id, int p, int q) {
if ((*(id + p)) == (*(id + q)))
printf("Connected\n");
}
void unite(int *id, int p, int q) {
int i;
for (i = 0; i < 10; i++) {
if ((*(id + i)) == (*(id + p)))
*(id + i) = *(id + q);
}
}
プログラムは想定どおりに実行されていません。a を実行してから a を実行しようとするunion(4,3)
と、その値union(3,8)
のみが変更され、 は変更されません。また、なぜ使用しなければならなかったのかわかりません(プログラムはそれなしで終了し続けました)。arr[3]
arr[4]
getchar