Bash 스크립팅에 대해 알아보기

Bash 스크립팅에 대해 알아보기

책의 다음 스크립트를 이해하는 데 약간의 문제가 있습니다.

values=(39 5 36 12 9 3 2 30 4 18 22 1 28 25)
numvalues=${#values[@]}

for (( i=0; i < numvalues; i++ )); do 
    lowest=$i

    for (( j=i; j < numvalues; j++ )); do
        if [ ${values[j]} -le ${values[$lowest]} ]; then
            lowest=$j
        fi
    done

    temp=${values[i]}
    values[i]=${values[lowest]}
    values[lowest]=$temp
done

for (( i=0; i < numvalues; i++ )); do
    echo -ne "${values[$i]}\t"
done

echo

스크립트는 배열의 숫자에 대해 선택 정렬을 수행하고 마지막으로 올바른 숫자 순서로 정렬합니다. 책에 따르면:

외부 i for 루프는 전체 배열을 반복하고 현재 "헤드"(교환해야 하는 값을 입력하는 위치)를 가리키는 데 사용됩니다. low 변수가 이 인덱스로 설정됩니다.

이 부분을 이해합니다. 첫 번째 반복의 가장 낮은 값은 인덱스 0, 값 39가 될 것 같습니다.

내부 j 루프의 작동 방식을 이해하는 데 문제가 있습니다. 그 책은 이렇게 말합니다.

나머지 요소를 가장 낮은 값과 비교합니다. 값이 가장 낮은 값보다 작으면 해당 요소의 인덱스를 설정합니다.

j의 값이 의 값과 어떻게 다른지 이해할 수 없습니다 i. 제 생각에는 j=i첫 번째 반복에서 0이면 이 값 j도 0과 같습니다. 나는 이것이 두 번째 및 후속 반복에서 변경되어야 할 것이라고 생각합니다. 스크립트 부분이 계산하는 값 이므로 값이 j값과 달라야 한다는 것을 알고 있습니다 .i[ ${values[j]} -le ${values[$lowest]} ]

내부 for 루프의 후속 부분 때문에 이것이 작동합니까 j=i? j++If j=i, 그리고 두 번째 반복에서 if 는 2와 같다는 i=1뜻인가요 ?j++

새 댓글:

이 스크립트에 대해 더 생각해 보십시오. 내부 루프에서 j=i+1이 어떻게 작동하는지 볼 수 있습니다. 첫 번째 반복에서는 i가 0이고 j가 1이므로 첫 번째 요소와 두 번째 요소의 값을 비교합니다. 추가 반복에서는 i=1 및 j=2, i=2 및 j=3 등…

그러나 내가 작성한 스크립트에서는 그것이 어떻게 작동하는지 잘 이해하지 못합니다. 첫 번째 반복에서는 i=0이고 j=0입니다. 따라서 배열의 첫 번째 값은 자신과 비교됩니다. 물론 두 번째 반복에서는 i=1, j=2이므로 두 번째 값과 세 번째 값을 비교합니다. 인덱스 0이 인덱스 1과 어떻게 비교되는지 알 수 없습니다. 5와 비교하면 39입니다. 물론 두 번째 반복에서는 5를 36과 비교하기 때문에 이를 건너뜁니다.

답변1

제 생각에는 첫 번째 반복에서 j=i가 0이면 j도 0과 같습니다.

올바르게, 내부 루프의 모든 첫 번째 반복에 대해 j는 와 같습니다 i.

나는 이것이 두 번째 및 후속 반복에서 변경되어야 할 것이라고 생각합니다.

또한 정확합니다(내부 루프의 경우). 내부 루프의 첫 번째 반복에는 j외부 루프의 반복에서 유지된 모든 값이 포함됩니다.i

스크립트 부분이 계산하는 값 이므로 값이 j값과 달라야 한다는 것을 알고 있습니다 .i[ ${values[j]} -le ${values[$lowest]} ]

(내부 루프의) 두 번째 반복부터 시작합니다.

If j=i, 그리고 두 번째 반복에서 if 는 2와 같다는 i=1뜻인가요 ?j++

이는 내부 루프 1 의 두 번째 반복에서도 마찬가지입니다 .

이제 내부 루프의 첫 번째 반복마다 , ijlowest동일합니다. 왜? lowest은(는) 이미 로 설정되어 있습니다 i. 반복 시작 시 로 설정하면 j후속 테스트는 로 설정됩니다. 즉, 동일한 요소를 비교하기 때문입니다. 따라서 이 내부 루프의 첫 번째 반복은 의미가 없으며 아무런 문제 없이 시작됩니다. 그러나 이는 실수가 아니며 단지 불필요할 뿐입니다.ilowestjii+1

기술적으로 1 은 2가 아니라 j++입니다 . 왜냐하면 변수 다음에 a가 호출되기 때문입니다.1++포스트 증분표현식에 변수를 평가한 후 값을 추가하는 연산자입니다. j2가 될 것이다뒤쪽에표현식이 평가되었습니다.

답변2

다음을 사용하는 "알고리즘"(4판, Sedgewick & Wayne)과 비교하면 내부 루프 for (( j=i; j < ...에 문제가 있는 것 같습니다 .

for (int j = i+1; j < ...

선택 정렬 예를 들어보세요.

관련 정보