[알고리즘] 삽입 정렬

2022. 2. 9. 21:21·알고리즘/풀이 힌트
반응형

삽입 정렬 : 각 숫자를 적절한 위치에 삽입하는 정렬 방법

​

1 10 5 8 7 6 4 3 2 9 를 오름차순으로 정렬하시오

int main(void) {  
			
	int i, j, tmp;
	int array[10] = { 1,10,5,8,7,6,4,3,2,9 };

	for (int i = 0; i < 9; i++) {
		j = i;
		while (j < 0 && array[j] > array[j + 1]) {
			tmp = array[j];
			array[j] = array[j + 1];
			array[j + 1] = tmp;

			j--;
		}
	}

	for (i = 0; i < 10; i++) {
		printf("%d\n", array[i]);
	}
	
	return 0;
}

삽입 정렬은 필요할 때만 위치를 바꾸는 특성이 있다.

​

삽입정렬은 비교 연산을 할때 자신 앞에 있는 수 들은

이미 정렬이 되어있다고 생각하기 때문에 자신이 왼쪽에 있는 것 보다 클 경우에만 멈추면 된다는 장점이 있다.

이러한 장점으로 인해 삽입 정렬은 버블 정렬이나 선택 정렬보다 효율이 좋다.

​

하지만 소스코드 상에서 반복문이 2개 사용되고 있다는 점에서 마찬가지로

1 + 2 + 3 + ... + 10

=> O(N * N) => O(N ^ 2)

​

삽입 정렬의 시간 복잡도

O(N ^ 2)

​

이지만 실제로는 삽입 정렬이 연산 횟수가 가장 적게 일어난다는 점에서 3개의 정렬 중에는 가장 효율적이다.

​

삽입 정렬은 앞서 말한 것처럼 '정렬이 되어 있다고 가정'을 한 점에서 특정한 경우 굉장히 빠른 속도를 자랑한다.

ex) 2 3 4 5 6 7 8 9 10 1

이것을 오름차순으로 정렬한다면 10까진 다른 연산을 수행하지 않고 1번만 연산을 하고 끝난다.

마지막에 1만 적절한 위치로 이동하기 위해 연산을 하기 때문에 삽입 정렬이 효율적이다.

-> 선택 정렬, 버블 정렬은 거의 정렬된 상태라도 그 사실을 알지못하고 끝까지 정렬을 수행하기 때문에 느리다.

​

즉 데이터가 거의 정렬된 상태하면 어떤 알고리즘보다 삽입 정렬이 가장 효율적이다.

​

1 3 5 2 4

​

1 3 2 5 4

​

1 2 3 5 4

​

1 2 3 4 5

​

삽입 정렬의 비교 횟수와 이동 횟수

비교 횟수는 O(N ^ 2)이고

이동 횟수는 정렬이 역순으로 되어있는 최악의 경우에는 비교 횟수와 마찬가지로

3(N * (N + 1) /2)번 이동하기 때문에 이동 횟수는 O(N ^ 2)이다

단 최악의 경우를 제외하고는 다른 정렬( 선택 정렬, 버블 정렬) 보단 효율적이다

반응형
저작자표시 비영리 변경금지

'알고리즘 > 풀이 힌트' 카테고리의 다른 글

[알고리즘] 퀵 정렬_구현  (0) 2022.02.09
[알고리즘] 퀵 정렬_원리  (0) 2022.02.09
[알고리즘] 버블정렬  (0) 2022.02.09
[알고리즘] 병합 정렬  (0) 2022.02.09
알고리즘 순서도 도형의 의미  (0) 2022.02.09
'알고리즘/풀이 힌트' 카테고리의 다른 글
  • [알고리즘] 퀵 정렬_구현
  • [알고리즘] 퀵 정렬_원리
  • [알고리즘] 버블정렬
  • [알고리즘] 병합 정렬
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    Docker
    네트워크
    영어독학
    바질 키우기
    알고리즘
    ChatGPT
    typescript
    다이소
    javascript
    타일러영어
    타입스크립트
    next.js
    식물
    네이버 부스트캠프
    자바스크립트
    CSS
    덤프
    redux
    프로그래머스
    Node.js
    ReactNative
    영어회화
    리얼클래스
    react
    Babel
    webpack
    바질
    CCNA
    리얼학습일기
    리액트
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[알고리즘] 삽입 정렬
상단으로

티스토리툴바