繁体   English   中英

在不使用 3rd(临时变量)的情况下进行交换在这个程序中给出了不同的答案,有人可以告诉我为什么吗?

[英]swapping without using 3rd(temporary variable) is giving diff answer in this program can someone tell me why?

当交换部分在第三个变量(临时变量)的帮助下完成时,它可以正常工作,但是当它在不使用临时变量(如 a=a+b; b=ab; a=ab;)的情况下完成时,output 会发生变化

此 quick_sort 程序工作正常,但 output 在交换方法更改时正在更改

#include<stdio.h>
void swap(int *a,int *b){/*
*a=*a+*b;
  *b=*a-*b;
  *a=*a-*b;*/
 int t=*a;
  *a=*b;
  *b=t;
}
int sort(int a[],int st,int piv){
int i=st-1,j,t;
for(j=st;j<=piv-1;j++){
if(a[j]<=a[piv]){
        i++;
   swap(&a[j],&a[i]);

  
}}
swap(&a[i+1],&a[piv]);
return i+1;

}
void quick(int a[],int st,int en){
if(st<en){
    int x=sort(a,st,en);
    quick(a,st,x-1);
    quick(a,x+1,st);
}
}
void main(){
int a[]={11,1,23,22,10,18,0,13},i;
quick(a,0,7);
for(i=0;i<8;i++)
printf("%d ",a[i]);

}

让我们看看您的替代版本的交换!

void swap(int *a,int *b){
    *a=*a+*b;
    *b=*a-*b;
    *a=*a-*b;
}

假设a=x,b=y ,那么我们得到: a=x+y ,然后是b=x+yy=xa=x+yx=y 这些可以证明您的交换代码是有意义的。 但问题在哪里? 您的推理暗示int* a独立于int* b 如果您尝试调用swap(&a[0],&a[0])而您的预期行为是让a[0]保持不变,则不会发生这种情况,因为ab指向完全相同的 memory 位置。

这是它的正确版本:

void swap(int *a,int *b){
  if(a==b) return;
  *a=*a+*b;
  *b=*a-*b;
  *a=*a-*b;
}

编辑:虽然此方法适用于大多数情况,但它可能由于a+b溢出而失败。 不要在实际代码中使用它,但请随意保留它以了解if(a==b) return; .

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM