Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[1877] Re:선택정렬 궁금증 . ^^
임문환 [mhlim] 1222 읽음    2003-01-23 20:49

우선 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]보타 클리는 없고...;;;
:
: 아무리 생각해도 모르겠어요.
:
: 이유를 아시는 분은 설명좀 . . ^^;
:
: 다른분들한테 물어보니 구냥 신경쓰지 말구 처음껄루 쓰라구 하시든데 . .;;
:
: 도무지 궁금해서 못참겠어요 ㅠ _ ㅠ
:
: 빠른 답변 부탁드려요 ~ ^^
:
: ( _ _ )

+ -

관련 글 리스트
1865 선택정렬 궁금증 . ^^ 김희섭 1299 2003/01/21
1877     Re:선택정렬 궁금증 . ^^ 임문환 1222 2003/01/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.