CS/알고리즘

선택 정렬

sun._.ny 2022. 7. 30. 20:22

선택 정렬이란?

 

* 데이터 배열에서 가장 작은(또는 가장 큰) 데이터를 선택하여 오름차순(또는 내림차순)으로 정렬할 때 사용

 

* 최소선택정렬 / 최대선택정렬 로 나뉨

 

  - 최소선택정렬 (Min-selection sort) : 매번 가장 작은 데이터를 선택하여 배열을 오름차순으로 변경
  - 최대선택정렬 (Max-selection sort) : 매번 가장 큰 데이터를 선택하여 배열을 내림차순으로 변경

 

 

 

 

 

 

 

 

 

선택 정렬 동작과정

(최소선택정렬 예시)


Step1. 전체 데이터에서 최솟값을 찾아냄
Step2. 찾은 최솟값을 배열의 가장 앞 원소와 교환
Step3. 그 다음으로 작은 데이터를 선택하여, 맨 앞에서 두번째 데이터와 자리 교환
Step4. 위와 같은 방식으로 오름차순 정렬 완료될 때까지 데이터를 선택하고 자리를 교환하는 과정을 반복

 

 

 

 

 

 

 

선택 정렬 알고리즘 구현

1) C

#include <stdio.h>
#include <stdlib.h>

int main() {
	int i, j, min, index, temp;
	int arr[10] = { 1, 9, 4, 6, 11, 10, 3, 15, 2, 13 };
	for (i = 0; i < 10; i++) {
		min = INT_MAX;
		for (j = i; j < 10; j++) {
			if (min > arr[j]) {
				min = arr[j];
				index = j;
			}
		}
		temp = arr[i];
		arr[i] = arr[index];
		arr[index] = temp;
	}
	for (i = 0; i < 10; i++)
		printf("%d ", arr[i]);
	return 0;
}



2) Python

arr = [8, 3, 0, 9, 1, 6, 2, 4, 7, 5]

n = len(arr)
for i in range(n):
    # 가장 작은 데이터의 인덱스
    min_idx = i
    for j in range(i+1, n):
        # 최솟값 찾기
        if (arr[min_idx] > arr[j]):
            min_idx = j
    # 데이터 간의 자리 변경
    arr[i], arr[min_idx] = arr[min_idx], arr[i]

print(arr)

 

 

 

 

 

 

 


선택정렬 시간 복잡도

N개의 데이터가 있을 때 N-1번만큼 가장 작은 데이터를 찾고 맨 앞으로 보내는 과정이 필요

따라서 N + (N-1) + (N-2) + (N-3) + (N-4) + ... + 2 만큼의 연산횟수가 필요

 

이를 근사치로 계산하면 N * (N+1) / 2

빅오 표기법으로는 O(N*N) 으로 표시