Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- C/C++ 구현
- 5397
- 1764
- 게리멘더링2
- 구현
- heap
- 백준 17471
- 백준 2447
- 원판 돌리기
- 스택의 특징
- dfs
- 조세퍼스 순열
- 백준 5397
- Stack 이란
- 별 찍기 10
- 자료구조
- 버킷 정렬
- 해시 구현
- 백준 17779
- 시간 복잡도
- 백준 1158
- 해시구현
- 백준 17822
- AVL 시간 복잡도
- ㅣ풀이
- qorwns
- 백준
- 백준 1406
- 풀이
- c#
Archives
- Today
- Total
홍시홍의 프로그래밍
삽입 정렬 (C/C++ 구현, 시간 복잡도) 본문
1. 삽입 정렬
삽입 정렬(揷入整列, insertion sort)은 자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여, 자신의 위치를 찾아 삽입함으로써 정렬을 완성하는 알고리즘이다.
출처 - 위키피디아(https://ko.wikipedia.org/wiki/%EC%82%BD%EC%9E%85_%EC%A0%95%EB%A0%AC)
나의 해석 : 현재 인덱스를 시작으로 인덱스 -1 자리에서 부터 0번 인덱스까지 비교하여 key 값의 자리를 찾아주어 정렬한다.
요구 사항
1. 배열 오름차순으로 구현
풀이 방법
제일 앞 인덱스부터 하나 하나 탐색한다.
1. 비교 인덱스가 큰거라면 앞으로 이동(오른쪽)
2. 비교 인덱스가 작다면 스톱(현재 인덱스의 위치 찾음)
3. 2의 자리와 현재 인덱스 위치 바꾸기
시간 복잡도
0번 인덱스[0]에서 0번 비교
1번 인덱스[1]에서 1번 비교
2번 인덱스[2]에서 2번 비교
3번 인덱스[3]에서 3번 비교
n-1번 인덱스에서[n] n-1번 비교
O(n^2)
소스 코드
#include <iostream>
using namespace std;
int a[5] = { 5,4,3,2,1 };
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
void insertion_sort(int list[])
{
int j;
for (int i = 0; i < 5; i++)
{
// 키 값
int key = list[i];
j = i - 1;
for (j = i - 1; j >= 0; j--)
{
//큰거라면 한칸 앞으로 (오른쪽으로 이동)
if (list[j] > key)
swap(list[j + 1], list[j]);
//아니라면 스탑 자기 자신 위치 찾음
else
break;
}
//찾은 위치와 키값 교환
swap(list[j+1], key);
}
}
int main()
{
insertion_sort(a);
for (int i = 0; i < 5; i++)
{
cout << a[i] << " ";
}
return 0;
}
'알고리즘' 카테고리의 다른 글
기수(radix) 정렬(C/C++ 구현, 시간 복잡도) (0) | 2019.09.23 |
---|---|
퀵(quick) 정렬(C/C++ 구현, 시간 복잡도) (0) | 2019.09.18 |
계수(Counting) 정렬(C/C++ 구현, 시간 복잡도) (0) | 2019.09.18 |
병합(합병) 정렬 (C/C++ 구현, 시간 복잡도) (0) | 2019.09.17 |
버블 정렬 (C/C++ 구현, 시간 복잡도) (0) | 2019.09.17 |
Comments