본문 바로가기
Computer Science/Algorithm

[알고리즘] 선택정렬(Selection Sort)

by SungJe 2017. 1. 20.

선택정렬(Selection Sort)

선택정렬(Selection Sort)은 데이터 집합에서 왼쪽 인덱스부터 정렬될 값과 해당 위치에 있는 값을 교환하며 정렬을 수행한다.

 

 - 이미 제자리에 있어도 비교를 수행한다.

 - O(n²)의 시간 복잡도를 갖는다.

 

 

기본 동작 과정

배열에 저장된 값을 오름차순 정렬으로 할 때 다음과 같은 동작 과정을 수행한다.

 

 ① 배열의 왼쪽부터 배열의 끝까지 비교를 수행한다.

 

 

 

 

 

 ② 비교를 수행하던 중 비교하는 값이 비교할 값 보다 작은경우 해당 인덱스를 기억한다.

 

 

 

 

 

 

 ③ 배열의 끝까지 비교를 수행했을때 기억해둔 인덱스의 요소 값과 비교하는 값을 교환한다.

 

 

 

 

 ④ 배열의 마지막 인덱스까지 비교하면 맨 첫 번째 값은 정렬된 상태이다.

 

 

1회

 

 

 

 ⑤ 모든 값이 정렬될 때까지 과정 ①, ②, ③ 반복

 

 

2회

 

 

 

3회

 

 

 

최종

 

※ n-1번 반복했을 때 정렬이 끝난다.

 

 

알고리즘 분석

선택정렬의 복잡도는 항상 O(n²)의 시간 복잡도를 갖는다.

 

최선·최악의 경우

 - 비교 횟수 : n(n - 1) / 2

 - 이동 횟수 : 3(n - 1)

 

선택 정렬 소스 코드

#include <stdio.h>

#define SWAP(x, y, t) ( ( t ) = ( x ), ( x ) = ( y ), ( y ) = ( t ) )

void Print(int arr[], int length) {
	printf("---- * Selection Sort 결과 * ----\n");
	for (int i = 0; i < length; i++) {
		printf("%d ", arr[i]);
	}
	printf("\n---------------------------------\n");
}

// 오름차순 선택 정렬
void SelectionSort(int arr[], int length) {
	int temp;

	for (int i = 0; i < length - 1; i++) {
		int least = i;
		for (int j = i + 1; j < length; j++)
			if (arr[j] < arr[least])
				least = j;
		SWAP(arr[i], arr[least], temp);
	}
}

void main() {
	int data[5] = { 3, 1, 4, 5, 2 };
	int length = sizeof(data) / sizeof(int);

	SelectionSort(data, length);
	Print(data, length);
}

 

 

 

'Computer Science > Algorithm' 카테고리의 다른 글

[알고리즘] 버블 정렬(Bubble Sort)  (0) 2016.12.30