当在第三个变量(临时变量)的帮助下完成交换部分时,它可以正常工作,但是在不使用临时变量的情况下(如a = a + b; b = ab; a = ab;)完成输出会更改
这个quick_sort程序可以正常工作,但是当交换方法更改时输出正在更改
#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+y-y=x
和a=x+y-x=y
。那些可以证明您的交换代码有意义。但是哪里有收获?您的推理暗示与int* a
无关int* b
。如果你尝试调用swap(&a[0],&a[0])
,而你预期的行为是为a[0]
保持不变,这并不因发生a
和b
指向完全相同的内存位置。
这是它的正确版本:
void swap(int *a,int *b){
if(a==b) return;
*a=*a+*b;
*b=*a-*b;
*a=*a-*b;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句