인접한 두 개의 데이터를 비교해가면서 정렬을 진행하는 방식
O(n^2)
최소/최대값을 선택하는 정렬
최소값을 선택하여, 맨 앞으로 swap한다.
O(n^2)
앞은 이미 정렬된 상태, 자신의 위치를 찾아서 삽입한다.
O(n^2)
void insertionSort(int arr[], int size) {
int i, j,key;
for (i = 1; i < size; i++) {
key = arr[i];
j = i - 1;
while (j >= 0&&arr[j]>key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
class Main {
static class Sort {
public void merge(int[] numbers, int startIndex, int midIndex, int lastIndex) {
int s = startIndex;
int l = midIndex + 1;
int index = startIndex;
int[] temp = new int[numbers.length];
while (s <= midIndex && l <= lastIndex) {
if (numbers[s] < numbers[l]) {
temp[index] = numbers[s];
s++;
} else {
temp[index] = numbers[l];
l++;
}
index++;
}
for (; s <= midIndex; s++) {
temp[index] = numbers[s];
index++;
}
for (; l <= lastIndex; l++) {
temp[index] = numbers[l];
index++;
}
for (int i = startIndex; i <= lastIndex; i++) {
numbers[i] = temp[i];
}
System.out.println();
}
public void mergeSort(int[] numbers, int leftIndex, int rightIndex) {
if (leftIndex >= rightIndex) {
return;
}
int mid = (leftIndex + rightIndex) / 2;
mergeSort(numbers, leftIndex, mid);
mergeSort(numbers, mid + 1, rightIndex);
merge(numbers, leftIndex, mid, rightIndex);
}
}
public static void main(String[] args) {
int[] numbers = {1, 4, 9, 1, 2};
new Sort().mergeSort(numbers, 0, numbers.length - 1);
System.out.println();
}
}
시간복잡도는 트리를 생각하면 된다.
배열을 처음부터 끝까지 비교할 때
for (int i ... n) : O(N)
요 배열을 처음부터 끝까지 비교하는 것을 절반만 수행한다.
N * logN : O(NlogN)
최악: O(n^2)
Heap 자료 구조를 활용한 정렬
Heap
O(NlogN)