![Bash 스크립팅에 대해 알아보기](https://linux55.com/image/72718/Bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8C%85%EC%97%90%20%EB%8C%80%ED%95%B4%20%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0.png)
책의 다음 스크립트를 이해하는 데 약간의 문제가 있습니다.
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 의 두 번째 반복에서도 마찬가지입니다 .
이제 내부 루프의 첫 번째 반복마다 , i
및 j
는 lowest
동일합니다. 왜? lowest
은(는) 이미 로 설정되어 있습니다 i
. 반복 시작 시 로 설정하면 j
후속 테스트는 로 설정됩니다. 즉, 동일한 요소를 비교하기 때문입니다. 따라서 이 내부 루프의 첫 번째 반복은 의미가 없으며 아무런 문제 없이 시작됩니다. 그러나 이는 실수가 아니며 단지 불필요할 뿐입니다.i
lowest
j
i
i+1
기술적으로 1 은 2가 아니라 j++
입니다 . 왜냐하면 변수 다음에 a가 호출되기 때문입니다.1
++
포스트 증분표현식에 변수를 평가한 후 값을 추가하는 연산자입니다. j
2가 될 것이다뒤쪽에표현식이 평가되었습니다.
답변2
다음을 사용하는 "알고리즘"(4판, Sedgewick & Wayne)과 비교하면 내부 루프 for (( j=i; j < ...
에 문제가 있는 것 같습니다 .
for (int j = i+1; j < ...
선택 정렬 예를 들어보세요.