한국방송통신대 알고리즘 강의 3강 정리노트입니다.
주어진 데이터를 값의 크기 순서에 따라 오름차순 혹은 내림차순으로 재배치하는 것이다.
정렬 수행 시점에 데이터가 어디에 저장되어 있으냐에 따라 내부 정렬, 외부 정렬로 구분한다.
값을 비교하여 정렬을 수행한다. 일반적으로 수행하는 정렬 알고리즘이다.
안정적인 정렬은 두 개의 동일한 값이 있을 때, 정렬 후에도 상대적인 위치가 정렬 후에도 바뀌지 않고 유지되는 정렬이다.
입력 배열 외에 별도로 필요한 저장 공간이 상수를 넘지 않는다. 데이터를 정렬하는 과정에서 원본 배열을 변경하여 추가적인 메모리 공간을 거의 사용하지 않는다.
입력 배열에서 가장 작은 값부터 순서대로 선택하여 나열하는 방식이다.
public static void selectionSort(int[] arr) {
int n = arr.length;
// 배열의 맨 앞부터 정렬해나감
for (int i = 0; i < n - 1; i++) {
int minIndex = i; // 현재 위치를 최소값 위치로 설정
// 현재 위치 이후의 값들과 비교해 가장 작은 값 찾기
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// 가장 작은 값과 현재 위치 값 교환
if (minIndex != i) {
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
모든 인접한 두 데이터를 차례대로 비교하여 왼쪽 데이터가 더 큰 경우에 오른쪽 데이터와 자리를 바꾸는 과정(swap)을 매 단계 반복하여 정렬을 수행한다.
public static void bubbleSort(int[] arr) {
int n = arr.length;
// 총 n-1번 반복
for (int i = 0; i < n - 1; i++) {
// 각 회전마다 인접한 두 수를 비교하고 필요 시 교환
for (int j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
// arr[j]와 arr[j+1]를 swap한다
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
public static void bubbleSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
boolean isSorted = true; // 정렬된 상태로 가정
for (int j = 0; j < n - 1 - i; j++) { // 왼쪽 -> 오른쪽
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
// 자리바꿈 -> 미정렬
isSorted = false;
}
}
// 이미 정렬된 상태이므로 종료
if (isSorted) {
break;
}
}
}
주어진 데이터를 하나씩 뽑은 후, 이미 나열된 데이터가 항상 정렬된 상태를 유지하도록 바른 위치에 삽입하여 나열하는 방식이다.
입력 배열을 정렬 부분과, 미정렬 부분으로 구분하여 처리한다.
public static void insertionSort(int[] arr) {
int n = arr.length;
for (int i = 1; i < n; i++) {
int key = arr[i]; // 현재 삽입할 값
int j = i - 1;
// 정렬된 부분에서 적절한 위치 찾기
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j]; // 오른쪽으로 한 칸씩 밀기
j--;
}
arr[j + 1] = key; // 올바른 위치에 삽입
}
}
삽입 정렬의 단점을 보완했다 (현재 삽입하고자 하는 데이터가 삽입될 위치에서 많이 벗어나 있어도 한 번에 한 자리씩 이동하여 자리를 찾는 단점)
public static void shellSort(int[] arr) {
int n = arr.length;
// gap 설정 (일반적으로 n/2)
for (int gap = n / 2; gap > 0; gap /= 2) {
// gap만큼 떨어진 요소들끼리 삽입 정렬 수행
for (int i = gap; i < n; i++) {
int temp = arr[i]; // 현재 위치 값 보관
int j = i;
// 앞쪽 요소들과 비교하며 정렬 위치 찾기
while (j >= gap && arr[j - gap] > temp) {
arr[j] = arr[j - gap]; // 앞쪽 요소를 뒤로 이동
j -= gap;
}
arr[j] = temp; // 올바른 위치에 삽입
}
}
}