我正在编写用于选择排序的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];
}
}
答案 0 :(得分:2)
您的h
和i
的值不会被隔离为不同的值。
在这种情况下交换不仅不会交换任何内容,而且还会破坏您的内存。
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;
注意:
除学术案例外,我不建议使用这种方法。 交换没有临时变量有很多缺点:
它也只有一个优势
如果您的目标是混淆读者,则应使用XOR(而不是算术)搜索版本。 ;)