您的位置:首页 > 职场人生

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

2014-12-14 00:07 246 查看
.------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。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐