这里的算法很新。当教授给出这段代码时,我开始看普林斯顿的算法和数据结构课程:
public void union(int p, int q){
int pid = id[p];
int qid = id[q];
for(int i = 0; i <id.length; i++){
if (id[i] = pid)
id[i] = qid;
}
他说你需要先将id [p]指定给pid。这是为什么?为什么你不能只使用id [p]?此外,我开始阅读算法简介,并看到了插入排序的这种实现。我注意到,他们并没有使用A [j]而是将其分配给'key'。是否与上述原因相同?谢谢!
INSERTION-SORT.A/
1 for j = 2 to A.length
2 key = A[j]
4 i = j - 1
5 while i>0 and A(i) > key{
6 A(i+1) = A(i)
7 i=i-1}
8 A[i+1] = key
答案 0 :(得分:2)
您必须将该元素复制到临时变量中,因为该值将在算法的后续阶段被覆盖。
考虑您建议的版本:
for(int i = 0; i <id.length; i++){
if (id[i] == id[p]) {
id[i] = id[q];
}
}
当i
等于p
时,id[p]
将被id[q]
的值覆盖。原来的id[p]
现在已经忘记了,算法的其余部分会产生错误的结果。试试吧!
是的,在插入排序中我们需要保存A [j]的原始值,原因相同:元素值被覆盖,否则我们将丢失原始值。