본문 바로가기
컴퓨터 이론/C언어 & 자료구조 & 알고리즘

52. 기수 정렬

by 컴퓨터공부용 2023. 7. 4.

기수 정렬이란?

기수 정렬은 비교 정렬이 아닌 정렬 알고리즘 중 하나로, 정렬할 요소들을 자릿수별로 비교하여 정렬하는 방법이다.

기수 정렬은 요소들을 자릿수별로 그룹화하고 정렬하는 방식으로 동작하며, 작은 자릿수부터 큰  자릿수까지 반복하여 정렬을 수행한다.

 

동작 방식

1. 정렬할 요소들을 가장 낮은 자릿수부터 가장 높은 자릿수까지 반복하여 처리한다.

2. 각 자릿수에 대해 요소들을 그 자릿수를 기준으로 그룹화한다.

3. 가장 낮은 자릿수부터 시작하여 요소들을 해당 버킷에 배치한다.

4. 버킷에 배치된 요소들을 순서대로 가져와 정렬된 순서로 재배치한다.

5. 모든 자릿수에 대한 처리가 완료될 때까지 위 과정을 반복한다.

 

동작 방식만 보면 쉽게 이해하기 어려울 수 있다. 코드를 보고 직접 구현하면서 이해하는 것이 가장 바람직한 것 같다.


// 기수 정렬 
void RadixSort(int User_Data[], int n){
	listPointer first = NULL;
	first = Create_List(first, n);
	
	//listPrint(first);
	first = radix_Sort(first);
	listtoArray(first, User_Data, n);
}
// 기수정렬 알고리즘 
listPointer radix_Sort(listPointer temp){
	int i, j, digit;
	listPointer front[RADIX_SIZE], rear[RADIX_SIZE];
	
	// 자리수만큼의 반복을 실행하는데 배열 인덱스때문에 자리수-1부터 0까지 진행 
	for(i=MAX_DIGIT-1;i>=0;i--){
		// front와 rear를 생성하여 초기화 시켜준다. 
		for(j=0;j<RADIX_SIZE;j++)
			front[j] = rear[j] = NULL;
		
		// 해당 자리의 기수위치에 노드를 옮겨둔다. 
		for(;temp;temp=temp->link){
			digit = temp -> key[i];
			if(!front[digit]) front[digit] = temp;
			else rear[digit] -> link = temp;
			rear[digit] = temp;
		}
		
		// 옮겨둔 노드를 링크드 리스트로 변환시킨다. 
		temp = NULL;
		for(j=RADIX_SIZE-1; j>=0; j--)
			if(front[j]){
				rear[j] -> link = temp;
				temp = front[j];
			}
	}
	return temp;
}

'컴퓨터 이론 > C언어 & 자료구조 & 알고리즘' 카테고리의 다른 글

51. 힙 정렬  (0) 2023.07.04
50. 합병정렬  (0) 2023.07.04
49. 퀵 정렬  (0) 2023.07.04
48. 삽입정렬  (0) 2023.07.04
47. 더 나은 버블정렬  (0) 2023.07.04

댓글