<pre name="code" class="cpp">// 通过异或交换的选择排序法
#include <stdio.h>
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 <stdio.h>
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<n; i++)
{
scanf("%d", &a[i]);
}
// 选择排序法
for(i=0; i<n-1; i++)
{
// 程序员自己给定的猜想最小值并保存数据和下标
min = a[i];
min_xiabiao = i;
// 查找最小值,并保存数据和下标
for(j=i; j<n; 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<n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
这样不难发现,在整个选择排序的过程中,代码是一致的,就是在互换的时候,使用异或的方式多加了一个判断
下面看下使用异或的时候,没有那句判断,运行结果。
为什么会出现这样的错误呢?
可是当初我讲我初始化的值随便输入,不按照这样的顺序,输出是没有问题。
正好,这样的顺序,让我发现了这样的问题,也算是赚到了。
下面看下debug的重点几步图片
当内for循环执行到10,也就是即将要退出的时候。
不难发现min_xiabiao 和 i 的值重复了。
看到这里,是不是会问为什么会这样呢?
其实了解异或的操作的话,你就会知道,其实是自身互换导致的。
自身互换为什么会变成 0 呢?
在这里我就不解释异或的使用了,大家可以百度一下:异或运算。百度百科有详细的说明。
通过下标为6的元素的,同样发现了这样的问题。
因此debug过后,个人的推测应该是正确的。
如果您认为我推测的不对的话,请留言给我哦~互相学习~
下面是有判断的异或运行结果。
与没有判断的结果完全不同。