我刚开始普林斯顿算法课程,并尝试在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);
}
}
程序没有按预期运行。当我尝试union(4,3)
然后union(3,8)
时,只有arr[3]
更改其值而不是arr[4]
。另外,我不确定为什么我必须使用getchar
(程序在没有它的情况下继续结束)。
答案 0 :(得分:0)
这一行:
if((*(id+i))==(*(id+p)))
相当于:
if (id[i] == id[p])
并使用p。
的当前id测试i的当前id问题是id [p]可能已经改为id [q]!
所以当你试图将所有3变为8时,在我们将arr [3]改为8后,从那时起我们只将8变为8。
而是尝试存储p的当前id,并对其进行测试:
void unite(int *id, int p, int q)
{
int i;
int id_to_change = id[p];
for(i=0;i<10;i++)
{
if(id[i] == id_to_change)
id[i] = id[q];
}
}