2014-09-30 3 views
1

나는 2 개의 다른 종류를 쓰고있다, 하나는 선택이고 다른 하나는 삽입이다. 다음은 삽입 방법입니다.선택 및 삽입 정렬에서 비교 횟수를 계산하는 방법은 무엇입니까?

public static void iSort(String[] array) 
{ 
    int i, j, k; 
    String temp; 
    for(i = 1; i<array.length; i++) 
    { 
    k=i; 
    for(j = k-1; j>=0 && array[j].compareTo(array[k])>0; j--) 
    { 
    ccounter++; 
    temp = array[j]; 
    array[j] = array[k]; 
    array[k] = temp; 
    k--; 
    } 
    } 
} 

여기서 ccounter는 정적 클래스 변수입니다. 이 문자열을 1000 요소 배열을 사용하여 테스트 할 때 239507 값을 얻을 수 있습니다. 그러나 올바르게 정렬 된 문자열 배열로 테스트 할 때 값이 0이됩니다. 올바른 경우 성능이 올바르지 않습니다. n 개의 용어에 대한 n 개의 비교. 내 방법이 잘못 쓰여지거나 카운터가 잘못 배치 된 것이 아닌가 궁금합니다

+0

를 증가 후 비교를. (즉, 결과가 '<= 0'인 결과를 비교하지 않음) – njzk2

+0

내부 for 루프에서 for 루프 내부로 비교를 이동하십시오. 현재는 교환해야 할 때만 계산됩니다. 루프 내에서 비교가 수행되면 모든 비교가 계산됩니다. – arunmoezhi

+0

@arunmoezhi 이렇게하면 루프 괄호에서 조건을 가져 와서 루프의 실제 본문에 배치 할 수 있습니까? – rubikscube09

답변

1

compareTo()false을 반환했기 때문에 루프를 종료하면 최종 비교가 계산되지 않습니다.

이 글을 쓰고 있다면 compareTo()을 호출하고 카운터를 증가시키는 함수에 비교 코드를 래핑 할 것입니다. 그런 다음이 비교자를 독점적으로 사용하여 모든 비교를 수행합니다. 이 방법은 오진의 기회가 없습니다.

0

증가 내부 루프의 모든 실행을위한 카운터와는 비교, 스왑을 계산하지 않은 카운터

public static void iSort(String[] array) 
{ 
    int i, j, k,ccounter=0; 
    String temp; 
    for(i = 1; i<array.length; i++) 
    { 
     k=i; 
     for(j = k-1; j>=0; j--) 
     { 
       ccounter++; //increment counter for every execution of inner loop 
       //better to do integer comparison than string comparison 
       if(Integer.parseInt(array[j]) <= Integer.parseInt(array[k])) 
       { 
        break; 
       } 
       temp = array[j]; 
       array[j] = array[k]; 
       array[k] = temp; 
       k--; 
     } 
    } 
} 
+0

너는 놀랐다. 충분히 고마워 할 수 없다. – rubikscube09

관련 문제