출처 : 시간복잡도 분석 연습 - 선택정렬 (종만복)
코드설명
선택정렬(Selection Sort)와 삽입정렬(Insertion Sort)를 구현했습니다.
선택정렬은, 맨 앞에서부터 하나씩 정렬해나가며, 이 정렬과정에서 매번 N-1개, N - 2개, N-3... 1개 이런식으로 반복문이 수행됩니다. 시간복잡도를 계산해보면 O((N)(N-1) / 2) = O(N^2)입니다. 즉, [i .. N]의 탐색범위에서 가장 작은 숫자를 "선택"해서 맨 앞에 설정한다 라고 이해하면 됩니다.
단순하게는 FOR문이 중첩되어 실행되므로 O(N^2)로 봐도 됩니다.
즉, 가장 맨 앞부터 가장 작은 숫자를 하나씩 채워나가는 것 입니다. 항상 가장 작은 숫자가 맨 앞씩 채워진다는 것이 보장되므로 앞의 숫자가 고정되며 A[N]까지 진행하면 결국 모두 정렬됨을 알 수 있습니다.
삽입정렬은, 만약 앞의 숫자(J-1)이 현재숫자(J)보다 크다면, SWAP 시키며 정렬합니다.
최악의 경우 빅 O(N^2) 입니다. 하지만, 만약 정렬된 숫자라면, O(N)의 시간복잡도(선형시간)를 가집니다.
테스트케이스
입력 예시 1
10
5 78 127 42 57 2 87 21 876 971
결과 예시 1
2 5 21 42 57 78 87 127 876 971
입력 예시 2
10
78 5 127 42 57 2 87 21 876 971
결과 예시 2
2 5 21 42 57 78 87 127 876 971
코드
선택정렬을 수행했을때의 코드입니다.
package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static int N, M;
public static int answer = 0;
public static int[] input;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
input = new int[N];
for(int i=0;i<N;i++) {
input[i] = Integer.parseInt(st.nextToken());
}
selectionSort(input);
for(int value : input) {
System.out.print(value+" ");
}
System.out.println();
}
public static void selectionSort(int[] A) {
for(int i=0; i<A.length; i++) {
int minIdx = i;
for(int j=i+1; j<A.length; j++) {
if(input[minIdx] > input[j]) {
minIdx = j;
}
}
swap(i, minIdx);
}
}
public static void swap(int aIdx, int bIdx) {
int storeNum = input[aIdx];
input[aIdx] = input[bIdx];
input[bIdx] = storeNum;
}
}
선택정렬 코드 2
package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static int C, N, M;
public static int answer = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
int[] A = new int[N];
st = new StringTokenizer(br.readLine());
for(int i=0;i<N;i++) {
A[i] = Integer.parseInt(st.nextToken());
}
selectionSort(A);
for(int i=0;i<N;i++) {
System.out.print(" "+A[i]);
}
}
public static void selectionSort(int[] A){
for(int i=0;i<A.length; i++) {
int minIdx = i;
for(int j=i + 1; j < A.length; j++) {
if(A[minIdx] > A[j]) {
minIdx = j;
}
}
swap(A, i, minIdx);
}
}
public static void swap(int[] A, int posA, int posB) {
int temp = A[posA];
A[posA] = A[posB];
A[posB] = temp;
}
}
삽입정렬을 수행했을때의 코드입니다.
package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static int N, M;
public static int answer = 0;
public static int[] input;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
input = new int[N];
for(int i=0;i<N;i++) {
input[i] = Integer.parseInt(st.nextToken());
}
insertionSort(input);
for(int value : input) {
System.out.print(value+" ");
}
System.out.println();
}
public static void insertionSort(int[] A) {
for(int i=0;i<N;i++) {
int j = i;
while( j > 0 && A[j-1] > A[j]) {
swap(j-1, j);
j--;
}
}
}
public static void swap(int aIdx, int bIdx) {
int storeNum = input[aIdx];
input[aIdx] = input[bIdx];
input[bIdx] = storeNum;
}
}
삽입정렬 2
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static int C, N, M;
public static int answer = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
int[] A = new int[N];
st = new StringTokenizer(br.readLine());
for(int i=0;i<N;i++) {
A[i] = Integer.parseInt(st.nextToken());
}
insertionSort(A);
for(int i=0;i<N;i++) {
System.out.print(" "+A[i]);
}
}
public static void insertionSort(int[] A) {
for(int i=0; i<A.length;i++) {
int j = i;
while(j > 0 && A[j-1] > A[j]) {
swap(A, j-1, j);
j-= 1;
}
}
}
public static void swap(int[] A, int posA, int posB) {
int temp = A[posA];
A[posA] = A[posB];
A[posB] = temp;
}
}