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

来源:互联网 发布:sql删除部分字段 编辑:程序博客网 时间:2024/06/06 17:59

.------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。


 

0 0
原创粉丝点击