[알고리즘] 삽입 정렬

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)
  • 태그

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

티스토리툴바