질문과 답변

간단한 정렬 코딩 문의합니다 날짜:2020-3-3 2:37:52 조회수:112
작성자 : Program
포인트 : 55
가입일 : 2020-02-13 11:49:35
방문횟수 : 26
글 6개, 댓글 10개
소개 : 재미있는 프로그램
작성글 보기
쪽지 보내기
개인적으로 정렬메뉴를 만들어 메뉴를 클릭하면 정렬되게 하는데
for(i=0;i<num;i++)//0부터 끝 num까지 순회하면서
{
    for(k=0;k<num;k++)//마찬가지 0부터 끝까지 순회
   {
        if(ar[i] < ar[k]) // ar[i] 와 ar[k] 크기를 비교하여 
        {
             imsi=ar[i]; //임시변수에 ar[i]를 잠시 넣어두고
             ar[i]=ar[k]; //i 변위와 k 변위의 값을 교환한다
             ar[k]=imsi; //마지막 임시저장값을 교환해 준다
        }
    }
}
이렇게 코딩하는데 이것이 괜찬은 가요?
보통 책에는 정렬종류를 늘어놓고 설명하는데
읽어보면 위와 좀 다르고 또 이해하기가 더 어렵고 해서
나는 위 코드로 이때까지 계속 써 먹어 왔는데..
문의해 봅니다

목록보기 삭제 수정 신고 스크랩

소엔 3월4일 4:25:46  

잘 동작하긴 합니다만 좀 불필요한 비교가 많아 보입니다.
전체 코드가 아니어서 일단 예제 형태로 만들어 보고 중간 결과를 출력하며 실행을 확인해 보았습니다.

#include <stdio.h>

int main() {
int ar[] = { 5, 8, 1, 6, 2, 9 };
int num = sizeof(ar) / sizeof(ar[0]);
int i, k, imsi;

for (i = 0; i < num; i++)//0부터 끝 num까지 순회하면서
{
for (k = 0; k < num; k++)//마찬가지 0부터 끝까지 순회
{
if (ar[i] < ar[k]) // ar[i] 와 ar[k] 크기를 비교하여
{
imsi = ar[i]; //임시변수에 ar[i]를 잠시 넣어두고
ar[i] = ar[k]; //i 변위와 k 변위의 값을 교환한다
ar[k] = imsi; //마지막 임시저장값을 교환해 준다
}
}
printf(" i = %d => ", i);
for (int j = 0; j < num; j++) printf("%d ", ar[j]);
}
}

중간 출력 결과는 다음과 같습니다.

i = 0 => 9 5 1 6 2 8
i = 1 => 5 9 1 6 2 8
i = 2 => 1 5 9 6 2 8
i = 3 => 1 5 6 9 2 8
i = 4 => 1 2 5 6 9 8
i = 5 => 1 2 5 6 8 9

결과적으로 정렬이 되기는 하지만 이중 루프를 다 도는 식이라 배열이 커지면 성능이 상당히 많이 떨어질 듯 합니다. 이미 정렬된 부분은 불필요한 비교를 생략하는 코드가 더 필요합니다. 어떻게 생략할 것인가는 각종 정렬 알고리즘별로 달라집니다.

코딩페인트 3월4일 9:11:54  

결국은 속도 문제인거죠
얼마나 적게 비교하면서 빠르게 정렬하는지
적은 수를 정렬하는거면 위처럼 해도 상관없지만
데이터가 커지면 그만큼 시간이 오래걸리니 다른 정렬 알고리즘을 사용하는거구욤

gcyong 3월4일 10:56:35  

정렬 문제 자체만 놓고 보면 상관은 없습니다만, 코딩페인트 님 말씀처럼 결국 성능 문제가 발생할 수 있습니다.

질문하신 분께서 어떤 상황에서 정렬 코드를 작성하시는지 잘 모르겠습니다만, 자료의 수가 늘어날 수록 알고리즘의 효율이 낮아지기 때문에 속도가 느려질 수 있습니다.

정렬 코드가 유난히 느려지면 다른 방법을 고려해보심이 옳을 듯 합니다.

Program 3월5일 8:29:09  

모두들 신경써서 댓글을 주시니 감사합니다.
실제 나의 경우는 구조체 자료로 1000개 정도 전후 저장하고 사용하는데 속도는 큰 차이가 없는 것 같아
그냥 그대로 사용하고 있습니다. 사실 책의 정렬알고리즘을 가져쓸려고 했는데 좀 이해도 안되고 해서
굳이 가져올 필요를 못 느끼고 있습니다.
하지만 5000개 정도의 자료를 저장하니 확실히 정력클릭하니 속도가 많이 늦긴 늦습니다.
구조체은
name,addr,birth,hobong....등등 필요한 필드로 구성되어 있고 이것들을 숫자비교나 스트링비교로
정렬하도록 메뉴를 구성하였습니다.
그나마 조금 개선했다고 할까하는 것은
for(i=0;i<num;i++)//0부터 끝 num까지 순회하면서
{
for(k=0;k<num;k++)//마찬가지 0부터 끝까지 순회
{
if(k==i) continue;//여기서 동일한 변위이면 통과 <======== 이것도 넣어보았습니다

if(ar[i] < ar[k]) // ar[i] 와 ar[k] 크기를 비교하여
{
imsi=ar[i]; //임시변수에 ar[i]를 잠시 넣어두고
ar[i]=ar[k]; //i 변위와 k 변위의 값을 교환한다
ar[k]=imsi; //마지막 임시저장값을 교환해 준다
}
}
}
다시 한번 감사합니다.


로그인하셔야 댓글을 달 수 있습니다.