알고리즘
삽입 정렬(Insertion Sort)
fenec_fox
2024. 4. 25. 20:17
삽입정렬은 배열을 정렬된 부분, 정렬되지 않은 부분으로 나눈 후, 원소를 순차적으로 탐색하면서 해당 원소를 정렬이 된 부분에 끼워 넣는 정렬입니다.
맨 처음 원소(1)를 정렬되었다고 가정한 후, 정렬되지 않은 다음 원소(2)를 정해 최근에 정한 원소(1)와 비교한 후 크다면 (1)의 오른쪽에 그렇지 않다면 그 자리에 그대로 정렬합니다.
시간복잡도는 각 원소에 대해 적당한 위치를 찾아주어야 하므로 총 원소의 개수 O( N ), 순차적으로 삽입 위치를 찾는데 O( N )이 들므로 O(N²)으로 힙정렬이나 합병정렬에 비해 비효율적(O(N log N))으로 잘 쓰이지 않습니다.
다음은 C++로 나타낸 코드입니다.
더보기
#include <iostream>
#define MAX 5005
using namespace std;
int d[MAX], n;
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> d[i];
}
for (int i = 0; i < n; i++) {
int temp = d[i];
int j = i - 1;
for (; j >= 0; j--) {
if (d[j] < temp)
break;
d[j + 1] = d[j];
}
d[j + 1] = temp;
}
for (int i = 0; i < n; i++)
cout << d[i] << “ “;
return 0;
}
다음은 Java로 나타낸 코드입니다.
더보기
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] d = new int[5005];
for (int i = 0; i < n; i++)
d[i] = scanner.nextInt();
for (int i = 0; i < n; i++) {
int temp = d[i];
int j = i - 1;
for (; j >= 0; j--) {
if (d[j] < temp)
break;
d[j + 1] = d[j];
}
d[j + 1] = temp;
}
for (int i = 0; i < n; i++)
System.out.print(d[i] + " ");
}
}
다음 시간엔 버블정렬에 대해 알아보겠습니다.