선택 정렬 (Selection Sort)

선택정렬은 반복적으로 정렬되지 않은 영역을 찾고, 정렬되지 않은 영역 내부에서 최소(최대)값을 찾아 영역 내의 제일 앞에 배치하여 정렬합니다.

 

이 알고리즘은 주어진 배열을 두개의 영역으로 나누어 사용합니다.

1) 이미 정렬된 영역

2) 아직 정렬되지 않은 영역

 

정렬의 매 순간 마다 정렬되지 않은 영역의 최소(최대) 원소는 선택되어 정렬된 영역으로 이동됩니다.

 

예)

{64, 25, 12, 22, 11}라는 배열이 주어진다면

처음엔 정렬된 영역{}, 정렬되지 않은 영역{64, 25, 12, 22, 11}으로 이루어지고,

오름차순을 가정

 

최소값을 찾아 정렬된 영역으로 이동 시킵니다.

{11}, 그럼 정렬되지 않은 영역에는 {64, 25, 12, 22}이 들어있습니다.

 

두번째엔

{11, 12}, {64, 25, 22}

...

{11, 12, 22}, {64, 25}

{11, 12, 22, 25}, {64}

{11, 12, 22, 25, 64} 순으로 정렬이 됩니다.

 

#include <bits/stdc++.h> 
using namespace std; 

void swap(int *xp, int *yp) 
{ 
	int temp = *xp; 
	*xp = *yp; 
	*yp = temp; 
} 

void selectionSort(int arr[], int n) 
{ 
	for(int i = 0; i<n-1;i++){
		int minidx = i;
		
		for(int j=i+1; j<n;j++){
			if(arr[minidx] > arr[j]){
				minidx = j;
			}
		}
		swap(&arr[i], &arr[minidx]);
	}
} 

void printArray(int arr[], int size) 
{ 	
	for (int i=0; i < size; i++) 
		cout << arr[i] << " "; 
	cout << endl; 
} 

int main() 
{ 
	int arr[] = {64, 25, 12, 22, 11}; 
	int n = sizeof(arr)/sizeof(int); 
	selectionSort(arr, n); 
	cout << "Sorted array: \n"; 
	printArray(arr, n); 
	return 0; 
}

 

시간복잡도: O(n^2) 2개의 루프문 때문.

불안정 정렬.

추가공간을 사용하지 않기에 제자리 정렬이다.

 

"선택 정렬은 정렬해야하는 원소를 선택해서 정렬된 영역으로 이동시켜 정렬한다."

'알고리즘 > 지식' 카테고리의 다른 글

[정렬 알고리즘] 합병 정렬  (0) 2020.03.03
[정렬 알고리즘] 삽입 정렬  (0) 2020.03.03
[정렬 알고리즘] 버블 정렬  (0) 2020.03.03
[기본] 정렬 알고리즘  (0) 2020.03.02
소수 판별  (0) 2019.12.06

+ Recent posts