수다닷컴

  • 해외여행
    • 괌
    • 태국
    • 유럽
    • 일본
    • 필리핀
    • 미국
    • 중국
    • 기타여행
    • 싱가폴
  • 건강
    • 다이어트
    • 당뇨
    • 헬스
    • 건강음식
    • 건강기타
  • 컴퓨터
    • 프로그램 개발일반
    • C언어
    • 비주얼베이직
  • 결혼생활
    • 출산/육아
    • 결혼준비
    • 엄마이야기방
  • 일상생활
    • 면접
    • 취업
    • 진로선택
  • 교육
    • 교육일반
    • 아이교육
    • 토익
    • 해외연수
    • 영어
  • 취미생활
    • 음악
    • 자전거
    • 수영
    • 바이크
    • 축구
  • 기타
    • 강아지
    • 제주도여행
    • 국내여행
    • 기타일상
    • 애플
    • 휴대폰관련
  • 프로그램 개발일반
  • C언어
  • 비주얼베이직

기수정렬(Radix sort)에대해 질문드립니다.

한가람

2023.04.01

제가 자료구조론을 수강하고있는대요 Radix sort에대해 알아오라고했더라고요. 교수님이 그리고 프로그램도 만들어야하는데.

기수정렬이라하겠음. 에대해 알아보니 자리수대로 비교하여 일의자리수 십의자리수 이렇게 차례대로비교하는 방법이라고

하더군요. 제가 기수정렬이대한 소스를 가져와서 분석하는데 비교될 숫자값이 어디서 입력되고 어디서 출력되는지는 알겠지만

radix_sort 부분에서 어디서 숫자들의 자릿수가 비교되는지 어떻게 순서가 정해지는지 잘모르겠네요. 프로그래밍 고수님들께

답변좀 부탁드리겠습니다. 저혼자서 기수정렬하는 프로그램을 짤수는있겠지만 먼저 이것부터 이해하고나서 만들어야겠네요

쩝.

#include stdio.h
#include stdlib.h
#define SIZE 10
#define BUCKETS 10 // 10진수
#define DIGITS 4 // 4자리 수까지 가능
#define MAX_QUEUE_SIZE 100
typedef int element;
typedef struct{
element queue[MAX_QUEUE_SIZE];
int front, rear;
}QueueType;
void error(char *message)
{
fprintf(stderr, %s\n, message);
exit(1);
}
// 초기화 함수
void init(QueueType *q)
{
q-front = q-rear = 0;
}
// 공백 상태 검출 함수
int is_empty(QueueType *q)
{
return (q-front == q-rear);
}
// 포화 상태 검출 함수
int is_full(QueueType *q)
{
return ((q-rear+1)%MAX_QUEUE_SIZE == q-front);
}
// 삽입 함수
void enqueue(QueueType *q, element item)
{
if(is_full(q))
error(큐가 포화상태입니다);
q-rear = (q-rear+1) % MAX_QUEUE_SIZE;
q-queue[q-rear] = item;
}
// 삭제 함수
element dequeue(QueueType *q)
{
if(is_empty(q))
error(큐가 공백상태입니다);
q-front = (q-front+1) % MAX_QUEUE_SIZE;
return q-queue[q-front];
}
void radix_sort(int list[], int n)
{
int i, b, d, factor=1;
QueueType queues[BUCKETS];
for(b=0; bn; b++)
init(&queues[b]); // 모든 큐 초기화
for(d=0; dDIGITS; d++)
{
for(i=0; in; i++) // 데이터들을 자리수에 따라 큐에 삽입
enqueue(&queues[(list[i]/factor)%10], list[i]);
for(b = i = 0; bBUCKETS; b++) // 버킷에서 꺼내 list로 합침
while(!is_empty(&queues[b]))
list[i++] = dequeue(&queues[b]);
factor *= 10; // 다음 자리수로 간다
}
}
// 리스트 출력 함수
void print_list(int list[])
{
int i;
for(i=0; iSIZE; i++)
printf(%d번째 값 : %d\n, i+1, list[i]);
}
///////////////////////////////////////////////////////////////////////////////////
// 메인 함수
void main()
{
int i, num=0;
int list[SIZE];
for(i=0; iSIZE; i++)
{
printf(%d번 값 : , i+1);
scanf(%d, &list[i]);
num++;
}
printf(정렬 전\n);
print_list(list);
radix_sort(list, num);
printf(정렬 후\n);
print_list(list);
}

신청하기





COMMENT

댓글을 입력해주세요. 비속어와 욕설은 삼가해주세요.

  • 소년틳터프

    답변감사드립니다 그런데 아무리봐도 자리수들의 크기를비교하는 곳은 찾아볼수가없네요. 그런데도불구하고 정수를입력하면 작은순서대로 차례대로 출력되는거보니 엄청신기하네요. 어떻게 자리수들의 크기 예를들어 일의자리 5는 9보다작다 이렇게 비교하지않고도 정렬이가능할수있을까요??

  • 히메

    여기만 보면 버켓소팅으로 짜여진것 같은데요. 처음 자리수, num %10으로 모듈러 하죠. 그러니까 큐에 넣어서 같은 자리수에 대해 일렬로 리스트를 모읍니다. 그런다음 다시 첫번째 요소부터 마지막 요소까지 링크드 리스크를 일렬로된 리스트로 만듭니다. 그런다음 다음 자릿수로 넘어갑니다. 여기서는 100의 자리겠죠? 그럼 이만^^ㅎㅎ 자러 갑니다~^^ㅎ

  • 들샘

    for(i=0; in; i++) // 데이터들을 자리수에 따라 큐에 삽입
    enqueue(&queues[(list[i]/factor)%10], list[i]);

    for(b = i = 0; bBUCKETS; b++) // 버킷에서 꺼내 list로 합침
    while(!is_empty(&queues[b]))
    list[i++] = dequeue(&queues[b]);
    factor *= 10; // 다음 자리수로 간다

  • 슬찬

    여기까지 전반적인 설명이였구요. 제가 소스 코드를 다 읽을 시간이 없어서 간단하게만 설명 드리면 % 연산이 있는 부분에서 숫자를 모듈러하고 버켓에다 넣는 것입니다. 버킷 소팅 방법은 아시겠죠? 저부분만 아신다면 나머지는 쉬우니 눈팅으로 따라가면 가능 할것이라고 봅니다. 저기가 핵심이니까요. 참고로 버킷 소팅이나 라딕스 소팅이나 거의 같습니다. 라딕스 소팅이 버킷을 이용하니까요.

  • 흰양말

    또한 버킷의 크기에 따라 속도가 달라짐에 유의 하시구요. 그러니까 tradeoff가 필요 합니다. 메모리를 많이 사용하면 속도가 빨라지구요. 메모리를 적게 사용하면 속도가 느려집니다. 두개의 절충점을 잘 생각해 보시구요. 또한 데이터에 둔감하죠. 양의 정수를 소팅할때 쓰이는 것이구요. 다른 좋은 소팅 알고리즘들도 많지만 양의 정수를 소팅할때는 이것만한 것도 없습니다~.

  • 석죽

    기수 정렬에는 직접 기수 정렬과 교환 기수 정렬이 있습니다. 둘다 아주 간단한 알고리즘으로 구현 가능하구요. 링크드 리스크로 구현할 경우 속도가 매우 느려지므로 배열로 구현 하는 것이 좋습니다.

번호 제 목 글쓴이 날짜
2695647 헉! 이클립스(v3.1)에서 발생되는 널포인트 익셉션? ;;; (3) 아빠몬 2025-05-22
2695586 IFRAME 캐싱 질문 봄나비 2025-05-22
2695498 [질문]실행가능한 jar파일.. 정말 이해가 안가네요... ㅡㅜ;; 터1프한렩 2025-05-21
2695468 자바랑 이클립스에서요.. 스킬 2025-05-21
2695375 Mysql 연동하는 자바 질문있습니다. 아리솔 2025-05-20
2695319 파워포인트 파일을 저장할 수 있을까요? 시윤 2025-05-19
2695289 [질문]Tween 값의 정도를 알고 싶습니다. 타마 2025-05-19
2695238 c 와 c++의 시작 (10) ChocoHoilc 2025-05-18
2695215 탑메뉴의 repeat-x .배경이 두가지에요ㅠ ㅠ 널위해 2025-05-18
2695187 자바스크립트와 자바의 import에 관해서 질문드려요 (1) 무슬 2025-05-18
2695116 테마 문의 (해당 사이트와 같은 테마 혹은 플러그인) Sweet 2025-05-17
2695084 [질문] starDrag()와 같은 함수 만들기 민구 2025-05-17
2695055 폰트 질문드립니다. 할인사이트에 많이 쓰는 굵은 숫자폰트.. (2) 일본녀 2025-05-17
2695025 [개발툴]Jcreator 에 관해서... (5) 에녹 2025-05-16
2695006 BitmapData ..무비클립에 적용 할수 있을까요? (1) 날위해 2025-05-16
2694977 C언어 소스문제점좀요 ... (2) 들꿈 2025-05-16
2694950 자바스크립트로 화면에 내용을 뿌려줄때 접근성 (3) 꺆잉 2025-05-16
2694921 보더 레이아웃 안에 플로우 레이아웃 넣는방법? 초롱 2025-05-15
2694894 웹 프로그래밍 관련해서 질문합니다. 창의적 2025-05-15
2694868 컨택트 폼 7에서 textarea 높이 조정 영글 2025-05-15
<<  이전  1 2 3 4 5 6 7 8 9 10  다음  >>

수다닷컴 | 여러분과 함께하는 수다토크 커뮤니티 수다닷컴에 오신것을 환영합니다.
사업자등록번호 : 117-07-92748 상호 : 진달래여행사 대표자 : 명현재 서울시 강서구 방화동 890번지 푸르지오 107동 306호
copyright 2011 게시글 삭제 및 기타 문의 : clairacademy@naver.com