정렬이란?
선형 자료구조(배열 등)의 원소들을 특정한 순서(오름차순 내림차순등)로 나열하는 것을 이야기 한다. 정렬 자체가 목적일 때도 있겠지만 대부분 검색등의 다른 알고리즘의 전처리 과정으로 사용되는 경우가 많다.
정렬알고리즘 종류
Permutaion Sort, Selection Sort , Bubble Sort , Quick Sort , Insertion Sort , Merge Sort 등 굉장히 많은 종류의 정렬알고리즘이 있다.
각 알고리즘의 방식과 구현방법, 시간복잡도를 알아보도록 하자.
이 글에서는 오름차순을 기준으로 설명하도록 하겠다.
1. Permutation Sort
모든 경우를 다 확인해보는 정렬 알고리즘이다. 즉 n개의 원소로 만들 수 있는 서로 다른 순열들을 모두 만들면서 정렬이 되어있는지 확인하는 과정을 거쳐서 정렬된 순열을 찾는 알고리즘이다.
n개의 원소로 만들 수 있는 순열의 개수는 n!이고 그 순열이 정렬된 상태인지 확인하기 위해서는 모든 원소를 한번 씩 보아야 하기 때문에 선형 시간이 걸린다. 따라서 시간복잡도는 $O(n \times n!)$이다.
2. Selection Sort (선택 정렬)
정렬 되지 않은 순열 중 가장 작은 원소를 찾아 첫번째 원소와 위를 바꾸는 방식으로 정렬을 하는 알고리즘이다.
글을 다 읽고 나서 잘 이해가 되지 않는다면 다음 영상을 참고하면 도움이 될 것이다. (속도가 답답하면 2배속으로 ^^)
각 단계미다 정렬되지 않은 부분에서 가장 작은 원소를 찾아 맨 앞 원소와 위치를 바꾸어 준다. 단계를 한번 진행 할 때마다 원소가 하나씩 정렬 되므로 전체 배열이 정렬되기 위해서는 배열의 길이 만큼 반복해 주면 된다.
687539를 이 방법을 사용해서 같이 한 번 정렬해 보도록 하자.
그림에서 붉은 색은 (정렬되지 않은 원소들 중) 가장 작은 원소이며
초록색은 정렬된 부분이다.
맨 처음에는 배열의 모든 상태가 정렬되어 있지 않다. 전체 배열에서 가장 작은 값은 3이다.
가장 작은 값 3을 맨 앞의 값 6과 위치를 바꾼다. 이제 한개의 원소가 정렬되었다.
이제 정렬되지 않은 원소가 5개가 되었다. 이중에 가장 작은 값 5를 찾는다.
가장 작은 값 5와 정렬된 배열 바로 뒤 자리의 값 8의 위치를 바꾼다. 이제 두개의 원소가 정렬되었다.
이제 정렬되지 않은 원소가 4개가 되었다. 이중에 가장 작은 값 6을 찾는다.
가장 작은 값 6과 정렬된 배열 바로 뒤 자리의 값 7의 위치를 바꾼다. 이제 세개의 원소가 정렬되었다.
이제 정렬되지 않은 원소가 3개가 되었다. 이중에 가장 작은 값 7을 찾는다.
가장 작은 값 7과 정렬된 배열 바로 뒤 자리의 값 8의 위치를 바꾼다. 이제 두개의 원소가 정렬되었다.
이제 정렬되지 않은 원소가 2개가 되었다. 이중에 가장 작은 값 8을 찾는다.
8의 위치가 이미 정렬된 원소들 바로 뒤에 있기 때문에 자리를 바꿀 필요가 없다.
마지막 원소는 자동으로 가장 큰 원소가 남기 때문에 정렬이 완료되었다.
시간복잡도
가장 작은 원소를 찾기 위해서는 모든 원소를 살펴 봐야 하고 이를 배열의 길이 만큼 반복 해야 한다. 한 단계마다 정렬되지 않은 배열의 길이가 하나씩 줄어들기 때문에 총 살펴봐야 하는 횟수는 $\sum^{n}_{i=0}i = \frac{n(n+1)}{2}$이다.
따라서 시간 복잡도는 $O(n^2)$이다. 느리지만 원리가 간단하고 구현이 쉽다는 장점이 있다.
구현
int smallest;
for(int i = 0; i < v.size()-1; i++){
smallest = i;
for(int j = i + 1; j < v.size(); j++){
if(v[smallest] > v[j]){
smallest = j;
}
}
int tmp = v[smallest];
v[smallest] = v[i];
v[i] = tmp;
}
}
'자료구조 알고리즘' 카테고리의 다른 글
<자료구조 알고리즘> 그래프 표현 1. adjacency List (인접 리스트) (2) | 2022.02.10 |
---|---|
<자료구조 알고리즘> 계획 및 보는 법 (2) | 2022.02.10 |
<자료구조 알고리즘> 그래프 개념 (0) | 2022.02.10 |
<자료구조 알고리즘> 배열 (2) | 2022.02.07 |
<자료구조 알고리즘> FFT를 이용한 다항식 곱셈 알고리즘 (0) | 2021.08.15 |