<위키백과 참조>
선택 정렬(selection sort)은 제자리 정렬 알고리즘의 하나로, 다음과 같은 순서로 이루어진다.
- 주어진 리스트 중에 최소값을 찾는다.
- 그 값을 맨 앞에 위치한 값과 교체한다(패스(pass)).
- 맨 처음 위치를 뺀 나머지 리스트를 같은 방법으로 교체한다.
비교하는 것이 상수 시간에 이루어진다는 가정 아래, n개의 주어진 리스트를 이와 같은 방법으로 정렬하는 데에는 Θ(n2) 만큼의 시간이 걸린다.
선택 정렬은 알고리즘이 단순하며 사용할 수 있는 메모리가 제한적인 경우에 사용시 성능 상의 이점이 있다.
https://ko.wikipedia.org/wiki/%EC%84%A0%ED%83%9D_%EC%A0%95%EB%A0%AC
선택 정렬 - 위키백과, 우리 모두의 백과사전
선택 정렬(選擇整列, selection sort)은 제자리 정렬 알고리즘의 하나로, 다음과 같은 순서로 이루어진다. 주어진 리스트 중에 최소값을 찾는다. 그 값을 맨 앞에 위치한 값과 교체한다(패스(pass)). 맨
ko.wikipedia.org
<구현>
입력 | 출력 |
6 13 5 11 7 23 15 |
5 7 11 13 15 23 |
위 표대로 입력이 주어질때, 오름차순으로 정렬하는 프로그램을 선택정렬을 통해 구현해보자.
import java.util.*;
public class Main {
public static int[] solution(int n, int[] arr){
for(int i=0;i<n-1;i++){
int min = arr[i];
int target = arr[i];
int idx = i;
for(int j=i+1;j<n;j++){
min = Math.min(min, arr[j]);
if(min == arr[j]) idx =j;
}
if(idx!=i){
arr[i] = min;
arr[idx] = target;
}
}
return arr;
}
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
int n = kb.nextInt();
int[] arr = new int[n];
for(int i=0;i<n;i++){
arr[i] = kb.nextInt();
}
for(int e : solution(n,arr)){
System.out.print(e + " ");
}
}
}
좀더 코드를 줄여보면,
public static int[] solution(int n, int[] arr){
for(int i=0;i<n-1;i++){
int idx = i;
int target = arr[i];
for(int j=i+1;j<n;j++){
if(arr[j]<arr[idx]) idx =j;
}
arr[i] = arr[idx];
arr[idx] = target;
}
return arr;
}
위처럼 solution 메소드를 수정할수 있다.
<설명>
2중 for문을 사용해서 정렬을 한다.
outter for문은 배열(arr)의 각 요소(i부터 n-1까지)에 접근하고, inner for문에서는 i+1부터 n까지 접근한다.
innerFor문에서는 i를 제외한 나머지 요소들 중에서 최소값을 구해서(Math.min()) min변수에 대입한다.
arr[i]과 min(arr[idx])의 위치를 바꾼다.
728x90
'CS > 알고리즘' 카테고리의 다른 글
너비 우선 탐색(Breadth-first search, BFS) (0) | 2021.09.15 |
---|---|
깊이 우선 탐색(depth-first search, DFS) (0) | 2021.09.15 |
이진 검색(binary search) (0) | 2021.09.10 |
삽입 정렬(insertion sort) (0) | 2021.09.09 |
버블 정렬 (bubble sort) (0) | 2021.07.05 |