선택정렬 (Selection Sort)

Algorithm/정렬 - O(n²)

2022. 3. 28. 20:28


- 선택정렬(Selection Sort) -

 

기준 위치(i)에서 나머지 원소들을 탐색(j)하여
가장 작은 값의 위치(idx)를 선택하고 맞바꾸는 정렬

 


 

문제인식)

다음 그림과 같은 수(數)의 배열이 있다.

int a[10] = {2, 10, 1, 9, 7, 4, 5, 8, 3, 6};

 

이 배열을 오름차순 정렬, 즉 가장 작은 수부터 차례대로 정렬하기 위해선 어떻게 프로그래밍 해야할까?

 


 

해결과정)

1) 기준 위치를 배열의 가장 왼쪽부터 차례대로 잡아나갈 것이고,

2) 기준위치를 잡았으면 그 나머지 원소들을 탐색하여 그들 중 가장 작은 값(최솟값)의 위치를 찾을 것이다.

(값 자체가 아닌 위치를 찾는 이유는 곧 나온다.)

3) 그리고는 기준 위치의 원소랑 최솟값 위치의 원소랑 맞바꾸는 것이다.

 

(※ [더보기]를 클릭하면 C/C++ 소스코드를 참조할 수 있습니다.)

더보기
int n, i, j, idx, tmp;
int a[10] = {2, 10, 1, 9, 7, 4, 5, 8, 3, 6};

n=10; //배열의 크기

for(i=0; i<n-1; i++) {
    idx=i;
    for(j=i+1; j<n; j++) {
        if(a[j]<a[idx]) idx=j;
    }
    tmp=a[i];
    a[i]=a[idx];
    a[idx]=tmp;
}

 

이렇게 하면

첫번째 자리에는 가장 작은 값이 위치하게 되고

두번째 자리에는 그 다음으로 작은 값이 위치하게 되어

결국에는 오름차순 정렬이 될 것이다.

 

메인 함수와 출력까지 나타낸 최종 코드는 다음과 같다.(C/C++)

더보기
#include <stdio.h>

int main() {
	int n, i, j, idx, tmp;
	int a[10] = {2, 10, 1, 9, 7, 4, 5, 8, 3, 6};
	
	n=10; //배열의 크기
	
	for(i=0; i<n-1; i++) {
	    idx=i;
	    for(j=i+1; j<n; j++) {
	        if(a[j]<a[idx]) idx=j;
	    }
	    tmp=a[i];
	    a[i]=a[idx];
	    a[idx]=tmp;
	}
	
	for(i=0; i<n; i++) {
		printf("%d ", a[i]);
	}
	
	return 0;
}

 


 

번외) 값 자체가 아닌 위치를 찾는 이유

맞바꾸기(swap) 작업을 할 때 문제가 생긴다.

idx가 아닌 값 자체를 저장하는 'min'이라는 변수를 두고 코드를 짰다고 가정했을때

swap을 하려고 한다면,,,

tmp=a[i];
a[i]=min;
min=tmp; //???

 

배열 a에다가 집어넣어야 할 값을 min에 다시 집어넣는 꼴이 되기 때문에

a의 원소끼리 맞바꾸는 과정이 없어지게 된다.

따라서 간접적으로 위치(idx)를 파악해서 맞바꿔야 한다.

 

응용)

내림차순 정렬해보기,

 

기준위치를 우측부터 잡고 진행해보기

 

'Algorithm > 정렬 - O(n²)' 카테고리의 다른 글

삽입정렬 (Insertion Sort)  (0) 2022.03.29
버블정렬 (Bubble Sort) | (+Special Sort)  (0) 2022.03.28