일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- SWEA
- regression
- spotify
- java
- c
- modern c++
- 프로그래머스
- 스포티파이
- 회귀
- CS
- 회원가입
- SECS-II
- MYSQL
- C++
- Gem
- SW Expert Academy
- python
- SECS/GEM
- Computer Science
- 파이썬
- spring boot
- Baekjoon
- 백준
- Spotify Api
- programmers
- Spring JPA
- 비트겟
- Spring
- 자바
- SECS
Archives
- Today
- Total
비버놀로지
[Computer Science] 기수 정렬 본문
728x90
기수정렬 (Radix Sort)
- 개념 기수 정렬은 낮은 자리수부터 비교하여 정렬해 간다는 것을 기본 개념으로 하는 정렬 알고리즘입니다. 기수정렬은 비교 연산을 하지 않으며 정렬 속도가 빠르지만 데이터 전체 크기에 기수 테이블의 크기만한 메모리가 더 필요합니다.
- 정렬 방식
- 0~9까지의 Bucket(Queue 자료구조)을 준비한다.
- 모든 데이터에 대하여 가장 낮은 자리수에 해당하는 Bucket에 차례대로 데이터를 둔다.
- 0부터 차례대로 버킷에서 데이터를 다시 가져온다.
- 가장 높은 자리수를 기준으로 하여 자리수를 높여가며 2번 3번 과정을 반복한다.
위의 그림과 같이 각 숫자에 해당하는 Queue공간을 할당하고 진행합니다.
먼저 1의 자리 숫자부터 시도를 합니다. 데이터 순서대로 각 1의 자리에 해당되는 Queue에 데이터가 들어가게 됩니다. 15같은 경우는 1의 자리가 5이므로 Queue 5에 들어가는 방식입니다.
위의 그림처럼 다시 0번 Queue부터 차례대로 데이터를 가지고 와서 원래의 배열에 넣어주게 됩니다.
1의 자리에 대한 정렬이 완료되었습니다. 다음으로는 10의 자리에 대하여 같은 작업을 반복합니다.
마찬가지로 각 데이터의 10의 자리에 해당되는 Queue에 데이터를 위치 시킵니다. 그런 다음 0번 Queue부터 차례대로 다시 데이터를 가지고 옵니다.
최종적으로 정렬이 완료가 됩니다.
- 특징
- 비교연산을 하지 않는다 → 시간복잡도 O(n)
- 자릿수가 있는 데이터(정수, 문자열 등)에서만 수행이 가능
- 자릿수가 적은 4바이트 정수 등에서나 제대로 된 성능을 발휘할 수 있으며, 자릿수가 무제한에 가까운 문자열 정렬 등에 사용할 경우 오히려 퀵정렬보다 느릴 수 있고, 부동 소수점의 경우는 부호여부, 지수부, 가수부에 대해 각각 기수정렬을 실행해야 한다
- '버킷' 이라는 추가적인 메모리가 할당되어야 한다.
package Radix;
public class RadixMain {
public static void main(String[] args) {
int[] arr = { 69, 10, 30, 2, 16, 8, 31, 22 };
RadixSort.sortLSD(arr, 2);
}
}
출처: <https://palpit.tistory.com/129> [palpit Vlog]
package Radix;
import java.util.LinkedList;
import Selection.SelectionSort;
public class RadixSort {
@SuppressWarnings("unchecked")
private static LinkedList[] counter = new LinkedList[] {
new LinkedList(), new LinkedList(),
new LinkedList(), new LinkedList(),
new LinkedList(), new LinkedList(),
new LinkedList(), new LinkedList(),
new LinkedList(), new LinkedList() };
// 버킷으로 사용할 counter 변수
// maxDigitSymbols는 정렬할 숫자 중에서 가장 많은 자릿수를 갖는 녀석 기준
public static void sortLSD(int[] array, int maxDigitSymbols) {
int mod = 10;
int dev = 1;
for (int i = 0; i < maxDigitSymbols; i++, dev *= 10, mod *= 10) {
for (int j = 0; j < array.length; j++) {
int bucket = (array[j] % mod) / dev;
counter[bucket].add(array[j]);
}
int pos = 0;
for (int j = 0; j < counter.length; j++) {
Integer value = null;
while ((value = counter[j].poll()) != null) {
array[pos++] = value;
}
}
System.out.println("기수 정렬 " + (i + 1) + " 단계:");
SelectionSort.printArr(array);
}
}
}
출처: <https://palpit.tistory.com/129> [palpit Vlog]
728x90
'Computer Science (CS)' 카테고리의 다른 글
[Computer Science] 카운팅 정렬 (0) | 2023.11.26 |
---|---|
[Computer Science] 퀵 정렬 (0) | 2023.11.19 |
[Computer Science] 정렬(선택, 버블, 삽입) (0) | 2022.10.10 |
[Computer Science] 힙(Heap) (0) | 2021.10.14 |
[Computer Science] B-트리(B-Tree) (0) | 2021.10.14 |
Comments