2017-12-03 8 views
-2

자바 선택 정렬에서 내부 루프 길이에 대한 기본적인 질문이 있습니다. 다음은 선택 정렬에 일반적으로 사용되는 코드입니다.Java에서 선택 정렬 루프 질문

package com.java2novice.algos; 

public class MySelectionSort { 

    public static int[] doSelectionSort(int[] arr) { 

     for (int i = 0; i < arr.length - 1; i++) { 
      int index = i; 
      for (int j = i + 1; j < arr.length; j++) 
      /* why not the length is not arr.length-1? I think the length is 
       exactly the same as what it is, the array's length is a 
       static number as array.length-1, but when it comes to the inner 
       loop why it plus 1 to the array length? */ 

       if (arr[j] < arr[index]) 
        index = j; 

      int smallerNumber = arr[index]; 
      arr[index] = arr[i]; 
      arr[i] = smallerNumber; 
     } 
     return arr; 
    } 
} 
+0

정확하게 무엇을하려고하고 있으며 어떤 문제가 있는지 설명하십시오. 정확히 작동하지 않는 것은 무엇입니까? – Keara

+0

내부 루프의 길이는 배열 길이와 같아야한다고 생각합니다. array.length -1과 같이 안정적인 값입니다. 배열의 길이에 1을 더하는 이유는 무엇입니까? ? –

답변

0

5 개의 항목을 정렬하려고한다고 가정 해보십시오. 배열 길이는 5이며 인덱스는 0에서 4까지입니다.

내부 루프의 첫 번째 반복에서 i=0j=1이 있습니다. 배열의 끝에 인덱스하려면 j이 필요합니다. 그래서 내부 루프의 표현식은 j < array.Length입니다.

i은 물론 0에서 3까지만 이동하기 때문에 외부 루프는 i < array.Length - 1입니다.

테이블에 5 개의 카드를 놓고 선택 정렬 단계를 거치면 여기에서 무슨 일이 일어나고 있는지 더 잘 알 수 있습니다.

0

첫 번째 루프는 마지막 인덱스를 확인할 필요가 없으므로 arr.length - 1으로 이동합니다. 물론 루프의 마지막 인덱스 (arr.length)로 이동하려면 두 번째 루프에서 배열의 마지막 인덱스를 검사해야합니다. 첫 번째 루프가 마지막 인덱스로 이동하는 경우를 상상해보십시오. 이 라인 for (int j = i + 1; j < arr.length; j++)은 절대로 실행되지 않습니다. 알고리즘을 더 잘 이해할 수 있도록이 선택 정렬 의사 코드를 확인하십시오. enter image description here