为什么在没有第三个变量的情况下交换在这里不起作用?

时间:2019-05-17 05:52:02

标签: c selection-sort

我正在编写用于选择排序的C语言代码。如果使用第三变量完成交换,但是在我更改交换方法而不使用第三变量的情况下,它工作正常,如下面的代码注释所示。它显示错误的输出(在某些位置为零)。我不知道为什么会这样?

在相同类型的条件下,我试图在另一个程序中交换两个没有第三变量的数字。但是在那里工作正常。但是为什么不在我的选择排序程序中。

#include<stdio.h>
void selectsort(int * ,int);//selection sort function


int main(){
int a[5];
int i,n=5;
for(i=0;i<5;i++)
scanf("%d",&a[i]);
selectsort(a,n);
printf("Sorted Array is:\n");

for(i=0;i<5;i++)
printf("%d\n",a[i]);
}



/* Below is selection sort function definition*/
void selectsort(int*p ,int q){
int i,j,h,temp;
for(i=0;i<q-1;i++){
h=i;
for(j=i+1;j<q;j++){
if(p[h]>p[j]){
h=j;
}
}

/* below code is to swap the two numbers ( p[i] and p[h]) without 
  using third variable , but it is NOT WORKING here
  (giving wrong output) BUT WORKING IF THIRD VARIABLE IS USED.Why?*/
p[i]=p[i]+p[h];
p[h]=p[i]-p[h];
p[i]=p[i]-p[h];
}
}

1 个答案:

答案 0 :(得分:2)

您的hi的值不会被隔离为不同的值。 在这种情况下交换不仅不会交换任何内容,而且还会破坏您的内存。

void selectsort(int*p ,int q){
  int i,j,h,temp;
  for(i=0;i<q-1;i++){
    h=i;   // <=== Here you start with identical values
    for(j=i+1;j<q;j++){
      if(p[h]>p[j]){
        h=j;    // This may or may not be executed.
      }
    }

    // Here h can still be at same value as i.
    // What happens in this case is shown in the comments below:
    p[i]=p[i]+p[h];  // p[i]=p[i]+p[i];  ==> p[i] *=2; 
    p[h]=p[i]-p[h];  // p[i]=p[i]-p[i];  ==> p[i] = 0;
    p[i]=p[i]-p[h];  // p[i]=p[i]-p[h];  ==> p[i] = 0;
  }
}

您可以在进行交换之前添加如下内容:

    if (i==h)
      continue;

注意:

除学术案例外,我不建议使用这种方法。 交换没有临时变量有很多缺点:

  • 仅适用于整数类型
  • 需要处理溢出等情况。
  • 需要处理相同的存储位置。
  • 需要额外的算术运算,从而导致更多的代码和更长的执行时间
  • 使读者困惑并且难以维护

它也只有一个优势

  • 为1个变量保存堆栈存储。

如果您的目标是混淆读者,则应使用XOR(而不是算术)搜索版本。 ;)