삽입 정렬 (Insertion Sort)

2023. 4. 27. 00:00·알고리즘 (with JAVA)/기본 알고리즘

1. 개념 설명

(1) 삽입 정렬은 인덱스 0번 위치 원소부터 시작하여 뒤 원소들과 비교하고 삽입할 위치를 지정한 후, 

원소를 뒤로 옮기고 지정된 자리에 자료를 삽입하는 알고리즘이다.

 

(2) 삽입 정렬은 선택 정렬과 유사하지만, 좀 더 효율적인 알고리즘이다.

 

(3) 선택 정렬과 함께 인간에게 뭔가를 정렬하라고 하면 무의식적으로 사용하는 대표적인 알고리즘이다.

 

 

 

 

2. 과정

by wiki

 

- 실제로 수행되는 과정이며, 삽입하는 동시에 정렬한다.

 

by wiki

 

 

 

 

3. 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class InsertSort {
    public static void main(String[] args) {
        int[] A = { 7, 2, 8, 10, 1 };
        
        for(int i=1; i<A.length; i++) {
            int tmp = A[i];
            int prev = i-1;
            
            while((prev>=0)&&(tmp<A[prev])) {
                A[prev+1] = A[prev];
                prev--;
            }
            A[prev+1] = tmp;
        }
        System.out.println(Arrays.toString(A));
    }
}
Colored by Color Scripter
cs

 

 

 

 

4. 시간 복잡도

(1) 만약 모두 정렬되어 있는 최선의 경우는 한 번씩 밖에 비교를 하지 않으므로 O(n)의 시간복잡도를 가진다.

 

(2) 또한 이미 정렬되어 있는 배열에 자료를 하나씩 삽입/제거하는 경우에는 최고의 알고리즘으로 꼽힌다.

( 탐색을 제외한 오버헤드가 적기 때문이다. )

 

(3) 그러나, 만약 역으로 정렬되어 있는 최악의 경우는 수행 횟수를 보면

(n-1) + (n-2) + ... + 2 + 1 --> n(n-1)/2가 나오게 되므로, O(n²)의 시간복잡도를 가진다.

 

 

 

 

5. 공간 복잡도

(1) 주어진 배열 안에서 정렬이 일어나므로, 공간 복잡도는 O(n)이다.

 

 

 

 

6. 장점

(1) 코드가 매우 단순하며 직관적이다.

 

(2) 대부분의 원소들이 정렬되어 있는 경우라면, 매우 효율적이다.

 

(3) 주어진 배열 안에서 정렬되기 때문에 다른 메모리 공간이 필요하지 않다.

( 제자리 정렬 (in-place sorting) )

 

(4) 안정 정렬이다.

 

(5) 거품 정렬, 선택 정렬과 같은 O(n²) 알고리즘보다는 상대적으로 빠르다.

 

 

 

 

7. 단점

(1) 평균과 최악의 시간 복잡도가 O(n²)이므로, 비효율적이다.

 

(2) 거품 정렬과 선택 정렬과 같이 배열의 길이가 길어질수록 비효율적이다.

저작자표시 (새창열림)

'알고리즘 (with JAVA) > 기본 알고리즘' 카테고리의 다른 글

기수 정렬 (Radix Sort)  (0) 2023.04.29
힙 정렬 (Heap Sort)  (0) 2023.04.29
병합 정렬 (Merge Sort)  (0) 2023.04.27
선택 정렬 (Selection Sort)  (0) 2023.04.27
퀵 정렬 (Quick Sort)  (0) 2023.04.27
'알고리즘 (with JAVA)/기본 알고리즘' 카테고리의 다른 글
  • 기수 정렬 (Radix Sort)
  • 힙 정렬 (Heap Sort)
  • 병합 정렬 (Merge Sort)
  • 선택 정렬 (Selection Sort)
백_곰
백_곰
  • 백_곰
    친절한 코딩
    백_곰
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘 (with JAVA)
        • 기본 알고리즘
        • 완전 탐색
        • 분할 정복 알고리즘
        • 동적 계획법
        • 탐욕법
        • 코딩 테스트 기출 문제
        • 코드트리 조별과제
      • 백준 (with JAVA)
        • 완전 탐색
        • 분할 정복
        • 그 외
      • 자바
        • 개발 환경 구축하기
        • 팁
        • 기본적인 개념
        • 컬렉션 프레임워크
        • 프로세스와 쓰레드
        • 지네릭스
        • 람다식
        • 스트림
        • 입출력 IO
        • 네트워킹
        • 열거형(enums)
        • java.lang 패키지
        • java.time 패키지
        • 유용한 클래스들
        • 형식화 클래스들
      • 안드로이드 with 자바
        • 응용 문제들
        • 자잘한 문제들
        • 오류 보고서
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      유용한 클래스
      람다식
      문자 기반 스트림
      제자리 정렬
      스트림
      선택 정렬
      snail
      불안정 정렬
      outputstream
      소켓 프로그래밍
      다형성
      안정 정렬
      Arrays
      안드로이드 스튜디오
      코딩테스트
      코딩트리조별과제
      java.time 패키지
      알고스팟
      자바 개념
      map()
      역직렬화
      serializable
      InputStream
      중간연산
      file
      ServerSocket
      코드트리
      Collections Framework
      TCP 소켓 프로그래밍
      java.lang패키지
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    백_곰
    삽입 정렬 (Insertion Sort)
    상단으로

    티스토리툴바