정렬 알고리즘은 다음과 같이 나눠볼 수 있다.
그 중에서 이번에는 선택 정렬에 대해 알아보려 한다.
int[] arr = {7, 6, 2, 4, 3, 9, 1};
private static void sort(int[] arr) {
for (int i = 0; i < arr.length; i++) { // 1
int standard = i;
for (int j = i + 1; j < arr.length; j++) { // 2
if (arr[j] < arr[standard]) standard = j; // 3
}
// 4
int temp = arr[standard];
arr[standard] = arr[i];
arr[i] = temp;
print(arr);
}
}
private static void print(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
// 단계별 결과.
1단계 : 1 6 2 4 3 9 7
2단계 : 1 2 6 4 3 9 7
3단계 : 1 2 3 4 6 9 7
4단계 : 1 2 3 4 6 9 7
5단계 : 1 2 3 4 6 9 7
6단계 : 1 2 3 4 6 7 9
7단계 : 1 2 3 4 6 7 9
쉽게 말해서 기준이 되는 수와 나머지 수를 비교해서 가장 작은 수를 앞으로 계속 보내는 정렬이다.
간단하지만, 매우 비효율적이다.
1단계 => n개의 원소 비교
2단계 => n-1개의 원소 비교
3단계 => n-2개의 원소 비교
...
를 하여 비교 횟수는
n(n-1)/2가 된다.
즉, 시간 복잡도는 O(N^2)이 된다.
최악의 경우, 최선의 경우, 평균적인 경우 모두 시간 복잡도는 O(N^2)이 된다.
공간 복잡도는 주어진 배열 안에서 교환을 통해 정렬이 수행되므로 O(N)이다.