2014-02-09 2 views
0

답변을 찾으려고 시도한 모든 토론을 읽었지만 답변이 없기 때문에이 방법을 시도하고 있습니다. 내 테스트 케이스로 간단한 배열을 사용하여선택 스왑 수를 계산하십시오. 정렬

public static int SelectionSort(long[] num) 
{ 
    int i, j, first; 
    long temp; 
    int swap = 0; 
    int pass = 0; 
    int count = 0; 
    boolean Mini = false; 

    for (i = num.length - 1; i > 0; i--) 
    { 
     for(int k = 0; k < num.length; k++) 
     { 
      System.out.println(" k = " + k 
      + " \t X[i] = " + num[k] + " swap count: " + swap); 
     } 
     System.out.println(""); 
     first = 0; //initialize to subscript of first element 
     for(j = 1; j <= i; j ++) //locate smallest element between positions 1 and i. 
     { 
      if(num[j] < num[first]) 
      { 
       first = j; 
       //Mini = true; 
      } 
     } 

     //if(Mini){ 
      // swap++; 
     //} 
     temp = num[first]; //swap smallest found with element in position i. 
     num[first] = num[i]; 
     num[i] = temp; 
    } 
    return swap; 
} 

: 그것은 첫 번째와 마지막 요소 만 교환 있기 때문에 스왑의 수는 1 동일시한다

long[] X = {1, 4, 3, 2, 5}; 

. 그러나 작동하지 않습니다. 나는 if 조건이 작동하지 않는다는 것을 알고 있지만, 나는 생각할 수 없다. 항목을 실제로 바꿀 때 스왑을 증가시키는 논리는 작동하지 않는 것 같습니다.

답변

2

실제로 스왑을 수행 할 때 카운터를 늘리지 않는 이유는 무엇입니까?

//swap smallest found with element in position i. 
swap++ 
temp = num[first]; 
num[first] = num[i]; 
num[i] = temp; 

편집 : 코멘트에
좋은 점. 배열이 정렬되어있는 경우 현재 코드는 여전히 불필요한 스왑을 수행한다 (즉, firsti은 동일) : 구현으로

if (first != i) { 
    swap++ 
    temp = num[first]; 
    num[first] = num[i]; 
    num[i] = temp; 
} 
+0

유일한 문제는 프로그램이 매번 스왑을 늘리는 것입니다. 나는 그것이 교환 할 때만 증가시키기를 원한다. 지금 당장 스왑을 증가 시키면 스왑 합계가 4가됩니다. 스왑을 1로 줄 수 있습니다. – tjg92

+0

예! 그게 효과가! 정말 고맙습니다! – tjg92

1

n은 요소의 수입니다 항상 (N 스왑이됩니다 정렬).

당신이 원한다고 생각하는 것은 "첫 번째"와 "i"가 다른 값을 가질 때 실제로 차이를 만드는 경우에만 스왑을 수행하는 것입니다. 그렇지 않으면 요소 자체를 전환합니다.

if (first != i) { 
    temp = num[first]; 
    num[first] = num[i]; 
    num[i] = temp; 
    swapp++; 
    }