정렬1
매우매우 많은 정렬이 있지만 그중 가장 안 어려운 3가지를 공부해보았다.
버블정렬 / 선택정렬 / 삽입정렬
모두 시간복잡도는 O(n^2)이다.
단순히 생각하면 for문을 두번 쓰기 때문이다.
# Swap 구현하기
1
2
3
4
5
6
7
void swap(int *ptr1, int *ptr2)
{
int temp;
temp = *ptr1;
*ptr1 = *ptr2;
*ptr2 = temp;
}
버블정렬 / 선택정렬 / 삽입정렬 모두 배열에서 자리를 바꾸는 행위를 해야한다.
Swap함수는 int형 변수의 주소를 2개 받아 그 주소에 변수를 바꿔서 넣는 것으로 구현했다.
문제 상황은 n개의 수를 입력받아서 arr[]배열에 넣어둔 후 부터 시작이다.
n개의 수는 중복되지 않는다 자세한 내용은 백준 2750번 문제를 참고하자
# 버블정렬 구현하기
1
2
3
4
5
6
7
8
9
10
for(int i=0;i<n;i++)
{
for(int j=0;j<n-1-i;j++)
{
if(arr[j]>arr[j+1])
{
swap(arr+j, arr+(j+1));
}
}
}
버블정렬은 {1번,2번} {2번,3번} … 이런식으로 비교해 나가며 큰수를 밀어내는 방식이다 그러면 마지막 수는 제일 큰수가 가게 되고 다음 반복할때는 마지막 배열-1 까지 for문을 실행하게 된다.
# 선택정렬 구현하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int min;
int *ptr1;
for(int i=0;i<n;i++)
{
min = arr[i];
ptr1 = &arr[i];
for(int j=i;j<n;j++)
{
if(arr[j]<min)
{
min = arr[j];
ptr1 = &arr[j];
}
}
swap(arr+i, ptr1);
}
선택정렬은 처음부터 끝까지 최소값 찾고 그 최소값을 제일 앞에 두는 방식이다
그러면 다음에 반복할 때는 두번째 부터 최소값을 찾기 시작한다.
# 삽입정렬 구현하기
1
2
3
4
5
6
7
8
9
10
11
for(int i=1; i<n;i++)
{
for(int j=i;j>0;j--)
{
if(arr[j]<arr[j-1])
{
swap(arr +j, arr+(j-1));
}
else break;
}
}
삽입정렬은 자기 왼쪽에 자기보다 큰수가 있다면 자리를 바꾸는 방식이다.
2번 자리 부터 시작해서 왼쪽의 수들을 정렬하는 식으로 구현했다.
This post is licensed under CC BY 4.0 by the author.