개념/알고리즘
삽입 정렬 (insertion sort)
웅드
2023. 11. 30. 22:42
삽입정렬은 자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여
자신의 위치를 찾아 삽입하는 알고리즘이다.
매번 비교할 때마다 앞 부분에 해당하는 범위 모두 타겟값과 비교하여 해당 원소를 삽입할 수 있는 위치를 찾아 배열 위치에 넣는다.
특징
- 구현이 간단하다.
- 배열의 사이즈가 커질 수록 효율성이 떨어진다.
- 선택 정렬이나 버블 정렬과 같은 O(n^2) 알고리즘에 비해 빠르고 안정된 정렬이다.
- 추가적인 공간을 필요로 하지 않는다.
- 데이터를 서로 교환하기 때문에 임시 변수가 필요하다.
시간 복잡도
- best
- 이동없이 한번씩만 비교할 경우
- O(n)
- worst
- 비교할때마다 i번씩 비교
- O(n^2)
구현하기
void print(vector<int> v, string s);
void insertion_sort(vector<int> v);
void insertion_sort_reverse(vector<int> v);
int main() {
vector<int> v = { 1, 7, 4, 3, 2, 9, 4 };
insertion_sort(v);
insertion_sort_reverse(v);
return 0;
}
void print(vector<int> v, string s) {
cout << s << " : ";
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
}
void insertion_sort(vector<int> v) {
int size = v.size();
for (int i = 1; i < size; i++) {
int value = v[i];
int pos = i - 1;
while (pos >= 0) {
if (v[pos] > value) {
v[pos + 1] = v[pos];
pos--;
}
else {
break;
}
}
v[pos + 1] = value;
}
print(v, "Insertion Sort");
}
void insertion_sort_reverse(vector<int> v) {
int size = v.size();
for (int i = 1; i < size; i++) {
int value = v[i];
int pos = i - 1;
while (pos >= 0) {
if (v[pos] < value) {
v[pos + 1] = v[pos];
pos--;
}
else {
break;
}
}
v[pos + 1] = value;
}
print(v, "Insertion Sort Reverse");
}
insertion_sort 함수
- index 1부터 반복이 시작되며 1에 위치한 값과 그 보다 왼쪽에 있는 원소들 간에 비교를 수행한다.
- 오름차순이기 때문에 작은 수일 수록 왼쪽에 위치해야한다. 인접한 왼쪽 값과 비교했을 때 왼쪽에 값이 클 경우 위치를 교환해준다.
- 반복해서 수행하다보면 정렬된 리스트를 얻을 수 있게 된다.
insertion_sort_reverse
- 내림차순 선택 정렬을 하는 함수이다.
- 인접한 왼쪽 값과 비교할 때 왼쪽 값이 더울 작을 경우 교환을 수행함으로 써 내림차순으로 정렬이 된다.
반응형