알고리즘과 자료구조/알고리즘 c언어
[c언어 알고리즘] 선택 정렬 과 삽입 정렬
has won
2020. 9. 1. 12:11
반응형
오늘은 선택정렬과 삽입정렬에 대해서 공부하겠습니다. 선택정렬과 삽입정렬 모두 시간복잡도가 O(n^2)입니다. 쉽게 설명하자면 이중반복문을 통해 구현하기 때문입니다. 그렇다면 이제 각각의 차이가 무엇인지 알아보도록 하겠습니다.
선택 정렬의 기본적인 아이디어는 리스트를 순회하면서 가장 작은 것을 제일 앞으로 보내는 방식입니다.
# include <stdio.h>
void main(){
int i, j, min, index, tmp;
int array[10] = = { 2, 1, 4, 3, 5, 7, 6, 8, 9, 10 };
for(i = 0; i<9; i++){
min = array[i];
for(j=i+1;j<10;i++){
if(min>array[j]){
min = array[j];
index = j;
}
}
temp = array[i];
array[i] = min;
array[index] = temp;
}
for(i=0;i<10;i++){
printf("%d", array[i]);
}
return 0;
}
삽입정렬의 기본적인 아이디어는 정렬된 리스트에서 다음 원소는 어디에 위치하지 삽입하는 것입니다.
1 2 3 5 6 4
이러한 배열인 상태에서 원소 4는 어떻게 정렬을 해야할지 컴퓨터의 사고방식으로 생각하겠습니다.
우선 4에서부터 뒤로 순회하면서 각 원소와 비교를 하겠습니다.
... 6 5
4가 더 작으므로 위치를 바꾼다고 생각하겠습니다. 다음으로
... 5 4
4가 더 작으므로 위치를 바꾼다고 생각하겠습니다. 다음으로
... 3 4
이제 4거 더 커서 위치를 바꾸지 않고 끝냅니다. 그러면 리스트의 결과는
1 2 3 4 5 6
이렇게 삽입정렬은 말 그대로 각 원소를 적절한 위치에 삽입을 하는 것입니다.
# include <stdio.h>
void main(){
int i, j, tmp;
int array[10] = = { 2, 1, 4, 3, 5, 7, 6, 8, 9, 10 };
for(i = 0; i<9; i++){
j = i+1;
while(array[j-1] > array[i+1]){
j-- ;
}
tmp = array[i+1];
array[i+1] = array[j];
array[j] = tmp;
}
for(i=0;i<10;i++){
printf("%d", array[i]);
}
return 0;
}
삽입 정렬은 거의 정렬된 데이터 속에서 선택정렬에 비해 월등히 빠르다고 말할 수 있습니다. 거의 정렬된 데이터에서는 비교할 연산 수 가 적기 때문입니다.
반응형