算法:为什么我需要将数组元素重新分配给变量?

时间:2016-12-28 16:03:04

标签: arrays algorithm

这里的算法很新。当教授给出这段代码时,我开始看普林斯顿的算法和数据结构课程:

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

1 个答案:

答案 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]的原始值,原因相同:元素值被覆盖,否则我们将丢失原始值。