|
우선 j를 0부터 시작하는 것은 문제가 있지만 그 것은 차치하고...
아래의 첫번째는 오름차순 코드네요.
두번째도 오름차순 정렬을 하려했다고 하고 시작합니다.
두번째와 같이 하시면 첫번째 루프(i=0)를 돌고 난 후 num[0]에 가장 작은 값이 오는 것이 아니라 num[MAX-1]에 가장 큰 값이 오게 됩니다.
문제는 두 번째 루프부터입니다.
두번째 루프부터는 i가 j보다 큰 경우가 있지요.
즉, i=1, j=0인 경우가 당장 두번째 루프에서 발생하지요.
그러면 최초에 의도했던 정렬방향과는 반대가 되네요.
세번째 루프에서는 j=0, j=1 이렇게 두가지가 반대지요.
정리하자면 i보다 작은 j에 대해서는 의도한 바와 반대로 내림차순정렬이 되고 큰 j에 대해서는 의도한대로 오름차순이 됩니다. i가 주 루프이고 i가 증가하는 방향으로 진행하므로 직전에 오름차순정렬해 두었던 것은 계속해서 무시되게 됩니다.
이렇게 해서 최종적으로 i가 MAX-1인 마지막 루프에서는 완전히 내림차순 정렬을 하게 됩니다.
김희섭 님이 쓰신 글 :
: 안녕하세요 ~ ^^
:
: for(i = 0;i < MAX;i++) {
: for(j = i + 1;j < MAX;j++) {
: if(num[i] > num[j]) {
: num[i] += num[j];
: num[j] = num[i] - num[j];
: num[i] -= num[j];
: }
: }
: }
:
: 위의 소스가 정확한 선택정렬 소스코드 잖아요 . . 작은 수부터 ~ 큰수로 . .;;
:
: 제가 오름차순하구 내림차순하구 좀 헷갈려서요 ^^;; 이해해주세요 .
:
: 근데요 .
: for(i = 0;i < MAX;i++) {
: for(j = 0;j < MAX;j++) { <---- 이부분 !! 에서 j 를 0 으로 바꾸기만 하면요
: if(num[i] > num[j]) {
: num[i] += num[j];
: num[j] = num[i] - num[j];
: num[i] -= num[j];
: }
: }
: }
:
: 처음의 선택정렬 결과의 반대의 결과가 나와요.
:
: i가 0이고 j루프를 다 돌고 나면 . num[0]엔 제일 작은 값이 들어가는게 맞죠?
:
: 그러면 num[j]가 다시 0부터 시작해도 num[1]보타 클리는 없고...;;;
:
: 아무리 생각해도 모르겠어요.
:
: 이유를 아시는 분은 설명좀 . . ^^;
:
: 다른분들한테 물어보니 구냥 신경쓰지 말구 처음껄루 쓰라구 하시든데 . .;;
:
: 도무지 궁금해서 못참겠어요 ㅠ _ ㅠ
:
: 빠른 답변 부탁드려요 ~ ^^
:
: ( _ _ )
|