일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- useReducer
- Apple Developer Academy @ POSTECH
- 앱 비교 프로젝트
- react
- global soop
- apple developer academy 후기
- ObservableObject
- swift문법
- 운영체제
- iOS 개발 오류
- OS
- 데이터베이스 공부
- 애플 디벨로퍼 아카데미 후기
- 네이버 부스트캠프
- sqoop
- Swift 기능
- ObservedObject
- 데이터베이스
- Swift 문법
- Swift 디자인패턴
- 애플 디벨로퍼 아카데미
- SWIFT
- 애플 아카데미 후기
- 애플 디벨로퍼 아카데미 21주차 회고
- 숭실대
- 소프트웨어분석및설계
- 제앱소
- 치지직
- 네이버 치지직
- StateObject
- Today
- Total
사과하는 제라스
기본 정렬 - Insertion sort(삽입 정렬) 본문
목차
[정렬 방법]
전체(n개의 값)에서 arr[1], arr[2], ..., arr[n-1] 순으로 기준값(key)으로 두고 바로 왼쪽 값부터 왼쪽에 있는 값들이 key보다 클 경우 한칸씩 오른쪽으로 옮긴다. 작을 경우엔 멈추고 비교대상이던 값의 오른쪽에 key값을 넣어준다. 이 과정을 arr[n-1]까지 진행하면 정렬된다.
[정렬 과정]
n 크기의 임의의 배열 arr에서
<1단계> - 1번의 비교
arr[1] 값을 key값으로 둔 후,
arr[0]와 비교해서 key값이 작으면 arr[1] = arr[0], arr[0] = key, key값이 크면 arr[1] = key
<2단계> - 최대 2번의 비교
arr[2] 값을 key값으로 둔 후,
arr[1]와 비교해서 key값이 작으면 arr[2] = arr[1]로 한 후 (1), key값이 크면 arr[2] = key
(1) arr[0]과 비교하여 key값이 작으면 arr[1] = arr[0], arr[0] = key, key값이 크면 arr[1] = key
.
.
.
<n-1단계> - 최대 n-1번의 비교
arr[n-1] 값을 key값으로 둔 후,
arr[n-2]와 비교해서 key값이 작으면 arr[n-1] = arr[n-2]로 한 후 (1), key값이 크면 arr[n-1] = key
(1) arr[n-3]과 비교하여 key값이 작으면 arr[n-2] = arr[n-3]로 한 후 (2), key값이 크면 arr[n-2] = key
(2) arr[n-4]과 비교하여 key값이 작으면 arr[n-3] = arr[n-4]로 한 후 (3), key값이 크면 arr[n-3] = key
...
(n-2) arr[0]과 비교하여 key값이 작으면 arr[1] = arr[0], arr[0] = key, key값이 크면 arr[1] = key
[pseudo code]
insertionSort(arr[], n) {
for i <- 1 to n-1
arr[0]-arr[i] 위치에서 맞는 곳에 arr[i]를 삽입
}
[코드 구현]
public class Insertion {
private static int[] input = {3, 54, 4, 12, 67, 31, 43, 56, 14, 53}; //예시로 작성한 배열
public static void main(String[] args) {
insertionSortMin(input, input.length); //혹은 insertionSortMax(input, input.length);
for (int i : input) {
System.out.print(i + " ");
}
}
private static void insertionSortMin(int[] input, int length) { //가장 작은 값부터 삽입 정렬하는 방법
int tmp;
for(int i=1; i<length; i++){
tmp = input[i];
int j = i-1;
while(0 <= j && input[j] > tmp){
input[j+1] = input[j];
j--;
}
input[j+1] = tmp;
}
}
private static void insertionSortMax(int[] input, int length) { //가장 큰 값부터 삽입 정렬하는 방법
int tmp;
for(int i=length-2; i>=0; i--){
tmp = input[i];
int j = i+1;
while(length-1 >= j && input[j] < tmp){
input[j-1] = input[j];
j++;
}
input[j-1] = tmp;
}
}
}
[시간 복잡도]
정렬이 잘 되어 있는 정도에 따라서
1) 최악의 경우
처음에 1번의 비교, 그 다음에 2번의 비교,... n-1번의 비교를 진행하므로
T(n) = ( 1+2+...+n-1 ) = O( n(n-1)/2 ) = O(n^2) 이 된다.
2) 최선의 경우
배열이 모두 정렬이 되어있는 경우로 처음부터 매 경우마다 비교 후 바로 끝나기 때문에 시간 복잡도는 O(n)이다.
3) 평균
Selection sort(선택 정렬)와 Bubble sort(버블 정렬)과 비교 시 최악의 경우는 같지만 최선의 경우엔 상대적으로 빠르다. 그러므로 평균은 절반 정도이다. 하지만 시간 복잡도는 O(n^2)이라 한다.
'알고리즘 학습 페이지' 카테고리의 다른 글
합병 정렬(Merge Sort) (0) | 2021.11.26 |
---|---|
유클리드 호제법(Euclidean Algorithm) (0) | 2021.11.26 |
기본 정렬 - Bubble Sort(버블 정렬) (0) | 2021.11.21 |
기본 정렬 - Selection sort(선택 정렬) (0) | 2021.11.20 |
에라토스테네스의 체 (0) | 2021.10.24 |