알고리즘

Selection Sort(선택 정렬)

llilliiillliill 2017. 12. 11. 19:21

이 글은 인프런의 영리한 프로그래밍을 위한 알고리즘 강좌를 듣고 정리한 내용입니다.


Selection Sort(선택 정렬)

선택 정렬은 제자리 알고리즘의 하나로, 다음과 같은 순서로 이루어진다.

1. 주어진 리스트 중에 최솟값 or 최대값을 찾는다.

2. 그 값을 맨 앞 or 맨 뒤에 위치한 값과 교체한다.

3. 맨 처음 위치를 뺀 나머지 리스트를 같은 방법으로 교체한다.


비교하는 것이 상수 시간에 이루어진다는 가정 아래, 

n 개의 주어진 리스트를 이와 같은 방법으로 정렬하는 데에는 Θ(n2) 만큼의 시간이 걸린다.


                     

출처 : 위키 백과


예제


[4, 54, 2, 8, 63, 7, 55, 56]    -> initial array


[4, 54, 2, 8, 56, 7, 55, 63]     -> after 1st swap


[4, 54, 2, 8, 55, 7, 56, 63]     -> after 2st swap


[4, 54, 2, 8, 7, 55, 56, 63]     -> after 3rd swap


[4, 7, 2, 8, 54, 55, 56, 63]     -> after 4th swap


[4, 2, 7, 8, 54, 55, 56, 63]     -> after 5th swap


[2, 4, 7, 8, 54, 55, 56, 63]     -> after 6th swap


의사 코드

Selection Sort(A[], n) {    // 배열 A[1...n]을 정렬한다.

for last <- n down to 2 {    ------------------------ ①

A[1...last] 중 가장 큰 수 A[K]를 찾는다;    ----- ②

A[k] <-> A[last];    ---------------------------- ③

}

}

실행 시간 : 

① 의 for 루프는 n-1 번 반복

② 에서 가장 큰 수를 찾기 위한 비교 횟수 : n-1, n-2, ... , 2, 1

③ 의 교환은 상수시간 작업


시간 복잡도


최선, 평균, 최악의 경우일 때에 선택 정렬에 소요되는 비교횟수를 C라고 했을때, 이를 수식으로 나타내면 다음과 같다.

수식에서 N은 테이블(또는 리스트)의 자료 수를 나타내며 는 평균, 는 최대, 는 최소를 나타낸다.


T(n) = (n-1) + (n-2) + ... + 2 + 1 =  Θ(n2)


소스 코드(Java)


package Sort;
//선택 정렬 알고리즘 구현
public class select {
int [] selectionsort(int [] data) {
int min; //최소값을 가진 데이터의 인덱스 저장
int temp = 0;
for(int i=0; i<data.length-1; i++) { // data.length-1 : 마지막 요소는 자연스럽게 정렬됨
min = i;
for(int j=i+1; j<data.length; j++) {
if(data[min] > data[j]) {
min = j;
}
}
temp = data[min];
data[min] = data[i];
data[i] = temp;
}
return data;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int [] data = {4, 54, 2, 8, 63, 7, 55, 56};
select test = new select();
// 선택 정렬 전 출력
System.out.println("# 선택 정렬 전");
for(int i=0; i<data.length; i++) {
System.out.print(data[i]+" ");
}
System.out.println();
//삽입 정렬 후 출력
System.out.println("# 선택 정렬 후");
test.selectionsort(data);
for(int i=0; i<data.length; i++) {
System.out.print(data[i]+" ");
}
}
}