본문 바로가기
Algorithm

[정렬] 선택 정렬 (Selection Sort)

by Ladun 2020. 1. 20.
  • 원소를 넣을 위치를 정해놓고 어떤 원소를 넣을지 찾아서 정렬한다.
  • 오름차순의 경우, 가장 작은 값을 찾아서 왼쪽부터 정렬을 하거나, 가장 큰 값을 찾아 오른쪽부터 정렬을 하는 방식이다.

1. i = ( 1 ~ (n - 1) )인덱스까지 탐색

2. j = ( (i + 1) ~ n ) 인덱스까지 탐색

3. j의 값 중에 가장 작은 값을 찾아 i번째의 값과 위치를 바꾼다.

4. 위 과정 반복


코드 구현

#include <stdio.h>

void PrintArray(int* arr, int size)
{
	for (int i = 0; i < size; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

void Selection(int* arr, int size)
{


	int min, tmp;
	for (int i = 0; i < size - 1; i++)
	{
		min = i;
		for (int j = i + 1; j < size; j++)
		{
			if (arr[min] > arr[j]) min = j;
		}
		tmp = arr[min];
		arr[min] = arr[i];
		arr[i] = tmp;
		printf("%d번째 순회: ", i + 1);
		PrintArray(arr, size);
	}
}


int main(void)
{
	int arr[5] = { 42, 51,86, 12 ,31 };

	printf("정렬 전: ");
	PrintArray(arr, 5);

	Selection(arr, 5);

	printf("정렬 후: ");
	PrintArray(arr, 5);

	return 0;

}

결과

더보기

정렬 전: 42 51 86 12 31
1번째 순회: 12 51 86 42 31
2번째 순회: 12 31 86 42 51
3번째 순회: 12 31 42 86 51
4번째 순회: 12 31 42 51 86
정렬 후: 12 31 42 51 86


정리

 

  • 시간 복잡도: (n - 1) + (n - 2) + ...... + 1 = n(n-1)/2 = O(n^2)

 

 

 

 

'Algorithm' 카테고리의 다른 글

Lower Bound & Upper Bound  (0) 2020.04.03
이분 탐색(Binary Search)  (0) 2020.04.03
[정렬] 삽입 정렬 (Insertion Sort)  (0) 2020.01.20
[정렬] 버블 정렬 (Bubble Sort)  (0) 2019.11.21
에라토스테네스의 체(Eratosthenes' sieve)  (0) 2019.03.17