黑马程序员---------异或在处理排序时的小问题

.------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

    今天,在写数组排序时,发现结果老是错误,部分数变成了0,代码如下

		class Array{
			public static void main(String []args){
				int []arr = {123,54,231,15,12,211};
				for(int i=0 ,j = 0,a=0;i<arr.length -1;i++){
					a = i ;
					for( j = i+1;j<arr.length;j++){
						if(arr[j] > arr[a] ){
							a = j ;
						}
					}
						arr[i] = arr[i] ^ arr[a];
						arr[a] = arr[i] ^ arr[a];
						arr[i] = arr[i] ^ arr[a];
				}
				for(int x :arr){
					System.out.println( x );
				}
			}
		}

输出结果为,231,211,0,54,15,12。
    很奇怪,本该是123的地方却成了0。手动交换了数组内顺序后,每次都有不同数变成0。响了一会,觉得可能是异或交换数据导致的,于是换成正常的第三方变量的方法。

class Array{
	public static void main(String []args){
		int []arr = {123,54,231,15,12,211};
			for(int i=0 ,j = 0,a=0;i<arr.length -1;i++){
				a = i ;
				int temp = 0;
				for( j = i+1;j<arr.length;j++){
					if(arr[j] > arr[a] ){
						a = j ;
					}
				}
					temp = arr[a];
					arr[a] = arr[i];
					arr[i] = temp;
			}
			for(int x :arr){
				System.out.println( x );
			}
	}
}

数据排序为231,211,123,54,15,12。排序正常,确定是异或的问题。于是我在异或交换数据后加了一行代码,打印a,i,arr[i]:
   System.out.println( a + "  " +i +"  " +arr[i] );
    发现当arr[i]为0时,a和i是相等的,至此就一切得到了解释,当数组选择排序时,如果这个数已经处在正确的位置上,那么这异或就相当于arr[i]^arr[i]^arr[i]^arr[i],自然是0;于是修改代码:

class Array{
	public static void main(String []args){
		int []arr = {123,54,231,15,12,211};
		for(int i=0 ,j = 0,a=0;i<arr.length -1;i++){
			a = i ;
			for( j = i+1;j<arr.length;j++){
				if(arr[j] > arr[a] ){
					a = j ;
				}
			}
				if( a!=i ){
					arr[i] = arr[i] ^ arr[a];
					arr[a] = arr[i] ^ arr[a];
					arr[i] = arr[i] ^ arr[a];
				}
		}
		for(int x :arr){
			System.out.println( x );
		}
	}
}

   排序正确的显示为231,211,123,54,15,12。
排序正确的显示为231,211,123,54,15,12。排序正确的显示为231,211,123,54,15,12。排序正确的显示为231,211,123,54,15,12。排序正确的显示为231,211,123,54,15,12。排序正确的显示为231,211,123,54,15,12。


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值