2012-12-17 4 views
0

선택 정렬에 대한 코드를 따르고 더 큰 요소와 가장 작은 요소를 교환하려고하면 XOR 연산자를 사용하여 작동하지 않습니다. values ​​대신 0을 표시합니다. 그러나 스왑은 두 개의 정수를 처리하고 있습니다. 왜요?선택 정렬을 바꿀 수 없습니까?

import java.io.*; 
    class selection 
    { 
public static void main(String s[])throws IOException { 
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 
    System.out.println("Enter n"); 
    int n=Integer.parseInt(br.readLine()); 
    System.out.println("Enter array"); 
    int a[]=new int[n]; 
    for(int i=0;i<n;++i) { 
     a[i]=Integer.parseInt(br.readLine()); 
    } 

    int min; 
    System.out.println("Entered Array : "); 
    for(int i=0;i<n;++i) 
     System.out.print(a[i]+" "); 

    for(int i=0;i<n;++i) { 
     min=i; 
     for(int j=i+1;j<n;++j) { 
      if(a[min]>a[j]) 
       min=j; 
     } 
     a[min]=a[min]^a[i]; 
     a[i]=a[min]^a[i]; 
     a[min]=a[min]^a[i]; 

    } 

    System.out.println("\nSorted Array : "); 
    for(int i=0;i<n;++i) { 
     System.out.print(a[i]+" "); 
    } 
} 
} 

출력은 다음과 같습니다 요소가 동일하고이 명시 적으로 대부분의 책에서 지적 된 경우 XOR와

Enter n 
8 
Enter array 
1 
5 
4 
6 
2 
8 
9 
7 
Entered Array : 
1 5 4 6 2 8 9 7 
Sorted Array : 
0 2 0 5 0 7 8 0 
+1

임시 값을 사용하는 것이 훨씬 간단합니다. –

답변

3

스와핑 요소가 작동하지 않습니다. 여기에서 일어나는 것은 다음과 같습니다. i 번째 요소가 i 번째 반복에서 최소 값이면 자체 값을 0으로 바꾸려고 시도합니다.

이 문제를 방지하려면 해당 값이 같은지 XOR을 사용하여 숫자를 교환하십시오. 귀하의 경우 배열에 동일한 요소가 포함되어 있지 않은 것으로 확신하는 경우 min==i 인 경우 스왑하지 마십시오.

+0

감사합니다. (최소! = i) {다음 스왑} 이제는 잘 작동합니다. – coder005

+0

@ coder005 : 더 나은 방법은 XOR 스와핑을 사용하지 않는 것입니다.이 방법은 불쾌한 해킹이며, 생각하는 것보다 효율적이지 않습니다. 임시 변수를 대신 사용하십시오. –

관련 문제