정렬알고리즘 - Insertion Sort (삽입 정렬) | C, Python 코드 구현

반응형

 

계속해서 정렬알고리즘에 대하여 공부하고 있다. 오늘은 정렬 알고리즘 중 삽입정렬 insertion sort에 대하여 알아보겠다. 삽입정렬을 두 번째 인덱스부터 기준점으로 잡고 기준점에서 앞 데이터들과 비교하며 기준점 데이터를 삽입할 위치를 정하여 정렬하는 알고리즘이다.

출처: wikipedia

📌삽입정렬이란

  1. 삽입정렬은 두 번째 index부터 시작하고, 이를 기준점으로 잡는다.
  2. 해당 인덱스 앞에 있는 데이터들과 비교하여 기준점의 데이터의 값이 앞 데이터들보다 더 작으면, 기준점을 그 앞 데이터의 뒤 인덱스로 복사한다. (기준점 바로 앞에 있는 값들부터 하나하나 비교하며 기준점이 더 크면 swap한다고 볼 수도 있겠다.)
  3. 기준점이 앞 데이터들 중에서 자신보다 더 큰 데이터를 만날 때까지 이를 반복하고, 큰 데이터를 만난 위치 바로 뒤에 기준점을 이동시킨다.
  • 데이터 길이가 n이라면 기준점을 잡는 것은 n-1번 필요하다. 즉, n-1번의 turn을 돌아야한다.
  • 그리고 각 turn에서 기준점과 그 앞 데이터들의 대소비교는 기준점의 index 번호의 값만큼 반복해주어야 한다. (기준점index-1부터 1까지)
  • 대소비교를 맨 앞 index까지 끝까지 하지 않더라도, 기준점보다 큰 데이터를 만났다면 멈춘다.

 

pseudo code 구현

  1. for index in range(len(data_list)-1) #n-1번의 기준점 잡기 (n-1번의 turn 필요)
  2. for index2 in range(index+1, 0, -1) #앞으로 하나씩 옮겨가며 기준점과 대소비교!
  3. 반복문 안에서 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(n2)이라고 할 수 있다.

완전정렬이 되어 있는 경우 두번째 for문은 돌지 않으므로 시간복잡도는 O(n)이다.

반응형

댓글