c语言用异或交换,C语言 - 选择排序中的--异或交换--问题分析

// 通过异或交换的选择排序法

#include

int main()

{

int i, val[10]={9,8,7,6,5 ,4,3,2,1,0}, j, min, min_xiabiao, temp ;

//for(i=0; i<10; i++)

//scanf("%d", &val[i]);

for(i=0; i<9; i++)

{

min = val[i] ;

min_xiabiao = i ;

for(j=i+1; j<10; j++)

{

if(val[j] < min)

{

min = val[j] ;

min_xiabiao = j ;

}

}

if(i != min_xiabiao)

val[i] ^= val[min_xiabiao] ^= val[i] ^= val[min_xiabiao] ;

}

for(i=0; i<10; i++)

printf("%d ", val[i]) ;

return 0;

}

// 通过第三变量temp交换的选择排序法

#include

int main(void)

{

int n, a[100], i, j, temp, min, min_xiabiao;

printf("Please Input The Value.Length Of:");

scanf("%d", &n);

printf("Please Input Your Number:");

for(i=0; i

{

scanf("%d", &a[i]);

}

// 选择排序法

for(i=0; i

{

// 程序员自己给定的猜想最小值并保存数据和下标

min = a[i];

min_xiabiao = i;

// 查找最小值,并保存数据和下标

for(j=i; j

{

if(a[j] < min)

{

min = a[j];

min_xiabiao = j;

}

}

// 交换最小数和第i个数

temp = a[i];

a[i] = a[min_xiabiao];

a[min_xiabiao] = temp;

}

printf("Output The Numbers:");

for(i=0; i

{

printf("%d ", a[i]);

}

printf("\n");

return 0;

}

这样不难发现,在整个选择排序的过程中,代码是一致的,就是在互换的时候,使用异或的方式多加了一个判断

下面看下使用异或的时候,没有那句判断,运行结果。

0818b9ca8b590ca3270a3433284dd417.png

为什么会出现这样的错误呢?

可是当初我讲我初始化的值随便输入,不按照这样的顺序,输出是没有问题。

正好,这样的顺序,让我发现了这样的问题,也算是赚到了。

0818b9ca8b590ca3270a3433284dd417.png

下面看下debug的重点几步图片

0818b9ca8b590ca3270a3433284dd417.png

当内for循环执行到10,也就是即将要退出的时候。

不难发现min_xiabiao 和 i 的值重复了。

0818b9ca8b590ca3270a3433284dd417.png

看到这里,是不是会问为什么会这样呢?

其实了解异或的操作的话,你就会知道,其实是自身互换导致的。

自身互换为什么会变成 0 呢?

在这里我就不解释异或的使用了,大家可以百度一下:异或运算。百度百科有详细的说明。

0818b9ca8b590ca3270a3433284dd417.png

通过下标为6的元素的,同样发现了这样的问题。

因此debug过后,个人的推测应该是正确的。

如果您认为我推测的不对的话,请留言给我哦~互相学习~

0818b9ca8b590ca3270a3433284dd417.png

下面是有判断的异或运行结果。

与没有判断的结果完全不同。

0818b9ca8b590ca3270a3433284dd417.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值