Sorting

Selection Sort

platinant 2016. 9. 19. 19:32
선택 정렬은 가장 직관적인 정렬 알고리즘이다. 아마 사람들이 손으로 직접 정렬을 할 때 가장 많이 사용할 것이다.

수들을 오름차순으로 정렬한다고 해보자.
먼저 가장 작은 수를 찾아 맨 앞에 놓은 뒤 나머지 수들에서 똑같은 절차를 반복하면 정렬된 수열을 얻을 수 있다.

이같은 간단한 아이디어를 코드로 구현하면 다음과 같다.


void SelectionSort(int N,int a[]){
	for(int i=0;i<N;i++){
		int pivot = a[i], pos = i;	
		for(int j=i;j<N;j++){
			if(pivot > a[j]){
				pivot = a[j];
				pos = j;
			}
		}
		swap(a[i],a[pos]);
	}
}



이 알고리즘에서는 i번째 최솟값을 찾을 때마다 N-i번의 비교가 필요하며 이 때문에 시간복잡도가 \(\BigO{N^{2}}\)이 된다.

여기서 가장 많은 시간이 소용되는 부분은 최솟값을 찾는 부분이다.
이 방법을 발전시키기 위해서는 최솟값을 빠르게 찾을 수 있어야 하는데 이는 자료구조를 통해 해결할 수 있다. Heap Sort에서는 Heap이라는 자료구조를 사용하여 빠르게 최솟값을 찾아 시간복잡도를 줄인다.

선택 정렬은 다른 \(\BigO{N^{2}}\)정렬에 비해 빠르게 동작한다. 비교 연산이 값을 바꾸는 연산이 더 빠른데 선택 정렬은 비교연산을 많이 하고 값을 바꾸는 연산을 적게 하기 때문이다.