2013-04-22 3 views
0

선택 정렬을 수행하지만 역방향으로 프로그램을 작성하려고합니다. 에서 것과 같이, 가장 큰 수를 찾아 내고 마지막 수로 교환하십시오. 왜 이것이 작동하지 않는지 나는 모른다.Java - 역순으로 선택 정렬

업데이트 코드에 따르면 의견.

import java.util.Scanner; 


public class Problem20 { 


    public static void main(String[] args){ 

     int data[] = new int[10]; 
     Scanner scan = new Scanner(System.in); 

     System.out.print("Please enter 10 numbers: "); 
     for (int i = 0; i < 10; i++) 
     { 
     data[i] = scan.nextInt(); 
     } 

     sortBig(data); 

    } 

    public static void sortBig(int[] data){ 

     int i, j, maxIndex, tmp; 

      for (i = data.length - 1; i >= 0; i--) 
      { 
       maxIndex = i; 

       for (j = i-1; j >=0; j--) 
        if (data[j] > data[maxIndex]) 
         maxIndex = j; 
        if (maxIndex != i) 
        { 
         tmp = data[data.length - 1]; 
         data[data.length - 1] = data[maxIndex]; 
         data[maxIndex] = tmp; 
        }    
      } 



     for (int r = 0; r < data.length; r++){ 
      System.out.print(data[r] + " "); 
     } 


    } 


} 
+5

디버거를 사용하여 프로그램의 코드를 단계별로 실행하여 실제로 수행중인 작업을 찾으십시오. –

+0

@ PeterLawrey 사람들을 괴롭히기 위해 여기에 오기 전에 여러 번 시도했습니다. – BluceRee

+0

실제로 j 값을 사용 했습니까? 아마도 data.length - 1 대신에? – Cameron

답변

0

당신은 루프에 대한 첫 번째 반전 할 필요가 - 당신은 또한 루프에 대한 첫 번째의 변화를 반영하기 위해 루프에 대한 두 번째를 수정해야합니다 for(int i = data.length - 1; i >= 0; i--)

(루프 내부는 잘 보이지만, 루프 초기화 블록을 수정해야 함)

+0

여전히 사용자가 입력 한 내용이 인쇄됩니다. – BluceRee

0

다음은 코드를 쉽게 디버그 할 수 있도록 작성한 간단한 테스트입니다.

import org.junit.Test; 

import java.util.Arrays; 

import static org.junit.Assert.assertEquals; 
import static org.junit.Assert.assertTrue; 

public class Problem20 { 

    @Test 
    public void testSorting() { 
     // passes 
     assertTrue(Arrays.equals(new int[]{1, 2, 3}, sortBig(3, 2, 1))); 
     // failed previously 
     assertTrue(Arrays.equals(new int[]{1, 2, 3, 4}, sortBig(4, 3, 2, 1))); 
     // create an array of unique values in pseudo random order 
     int[] largeArray = new int[1000]; 
     for (int i = 0; i < largeArray.length; i++) 
      largeArray[i] = (i * 29) % largeArray.length; 
     int[] sortedArray = sortBig(largeArray); 
     for (int i = 0; i < largeArray.length; i++) 
      assertEquals(i, sortedArray[i]); 
    } 

    public static int[] sortBig(int... data) { 
     for (int i = data.length - 1; i >= 0; i--) { 
      int maxIndex = i; 

      for (int j = i - 1; j >= 0; j--) 
       if (data[j] > data[maxIndex]) 
        maxIndex = j; 
      if (maxIndex != i) { 
//    int tmp = data[data.length - 1]; 
       int tmp = data[i]; 
//    data[data.length - 1] = data[maxIndex]; 
       data[i] = data[maxIndex]; 
       data[maxIndex] = tmp; 
      } 
     } 
     return data; 
    } 
} 

정렬 실패 내가 찾은 간단한 목록 4,3,2,1이고 그것을 디버깅에 의해 난 당신이 항상 마지막 요소와 교환되었다 볼 수없는 마지막 요소 data.length -1을 한 후 i을 검색되는 대용량 배열에서도 테스트가 작동했습니다.