반응형
계속해서 정렬알고리즘에 대하여 공부하고 있다. 오늘은 정렬 알고리즘 중 삽입정렬 insertion sort에 대하여 알아보겠다. 삽입정렬을 두 번째 인덱스부터 기준점으로 잡고 기준점에서 앞 데이터들과 비교하며 기준점 데이터를 삽입할 위치를 정하여 정렬하는 알고리즘이다.
📌삽입정렬이란
- 삽입정렬은 두 번째 index부터 시작하고, 이를 기준점으로 잡는다.
- 해당 인덱스 앞에 있는 데이터들과 비교하여 기준점의 데이터의 값이 앞 데이터들보다 더 작으면, 기준점을 그 앞 데이터의 뒤 인덱스로 복사한다. (기준점 바로 앞에 있는 값들부터 하나하나 비교하며 기준점이 더 크면 swap한다고 볼 수도 있겠다.)
- 기준점이 앞 데이터들 중에서 자신보다 더 큰 데이터를 만날 때까지 이를 반복하고, 큰 데이터를 만난 위치 바로 뒤에 기준점을 이동시킨다.
- 데이터 길이가 n이라면 기준점을 잡는 것은 n-1번 필요하다. 즉, n-1번의 turn을 돌아야한다.
- 그리고 각 turn에서 기준점과 그 앞 데이터들의 대소비교는 기준점의 index 번호의 값만큼 반복해주어야 한다. (기준점index-1부터 1까지)
- 대소비교를 맨 앞 index까지 끝까지 하지 않더라도, 기준점보다 큰 데이터를 만났다면 멈춘다.
pseudo code 구현
for index in range(len(data_list)-1)
#n-1번의 기준점 잡기 (n-1번의 turn 필요)-
for index2 in range(index+1, 0, -1)
#앞으로 하나씩 옮겨가며 기준점과 대소비교! - 반복문 안에서
data_list[index2]
가data_list[index2-1]
보다 작으면 swap, 크면 두번째 for문 탈출 (앞으로의 조건체크를 더이상 진행할 필요 x)
📌알고리즘 구현 (C)
void insertion_sort(int *num_arr, int arr_len){
int i, j, key;
if (arr_len == 1)
return;
for (i = 1; i <= arr_len; i++){
key = num_arr[i];
for (j = i-1; j >= 0 && num_arr[j]>key; j--){
num_arr[j + 1] = num_arr[j];
}
num_arr[j + 1] = key;
}
}
📌알고리즘 구현 (Python)
def selection_sort(num_list):
for i in range(1, len(num_list)):
for j in range(i):
if num_list[j] > num_list[i]:
num_list[i], num_list[j] = num_list[j], num_list[i]
else:
break
return num_list
📌알고리즘 분석
반복문이 2개이고, 각각의 반복문이 n 즉, len(data_list) 의 영향을 받으므로 시간복잡도는 $$O(n^2)$$이라고 할 수 있다.
완전정렬이 되어 있는 경우 두번째 for문은 돌지 않으므로 시간복잡도는 $$O(n)$$이다.
반응형
'Algorithm' 카테고리의 다른 글
탐색알고리즘(1) Sequential Search (순차 탐색) (0) | 2021.05.07 |
---|---|
정렬알고리즘 - Quick Sort (퀵 정렬) | C, Python 코드 구현 (0) | 2021.05.07 |
정렬알고리즘 - Merge Sort (병합정렬) | C, Python 코드 구현 (0) | 2021.05.07 |
정렬알고리즘- Selection Sort (선택 정렬) | C, Python 코드 구현 (0) | 2021.05.07 |
정렬 알고리즘 - Bubble Sort (버블 정렬) | C, Python 코드 구현 (0) | 2021.05.07 |
댓글