선택정렬은 현재 위치에 들어갈 값을 찾아서 바꾸는 알고리즘이다. 오름차순으로 정렬하는 선택정렬은 다음과 같은 과정을 거친다.
public class SelectionSort {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public int[] solution(int[] arr){
int[] result = arr;
for(int i=0; i<arr.length; i++){
int minidx = i;
for(int j=i; j<arr.length; j++){
if(result[minidx]>result[j])
minidx = j;
}
int temp = result[i];
result[i] = result[minidx];
result[minidx] = temp;
}
return result;
}
public static void main(String[] args) throws IOException {
SelectionSort s = new SelectionSort();
String[] temp = br.readLine().split(" ");
int[] arr = new int[temp.length];
for(int i=0; i<temp.length; i++){
arr[i] = Integer.parseInt(temp[i]);
}
System.out.println(Arrays.toString(s.solution(arr)));
}
}
interface StatementStrategy{
boolean compare(int a, int b);
}
public class SelectionSort2 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public int[] solution(int[] arr,StatementStrategy stmt){
int[] result = arr;
for(int i=0; i<arr.length; i++){
int minidx = i;
for(int j=i; j<arr.length; j++){
if(stmt.compare(result[minidx],result[j])) // interface를 통해 값만 구현후 원하는 식에 넣어 사용
minidx = j;
}
int temp = result[i];
result[i] = result[minidx];
result[minidx] = temp;
}
return result;
}
public static void main(String[] args) throws IOException {
SelectionSort2 s = new SelectionSort2();
String[] temp = br.readLine().split(" ");
int[] arr = new int[temp.length];
for(int i=0; i<temp.length; i++){
arr[i] = Integer.parseInt(temp[i]);
}
System.out.println(Arrays.toString(s.solution(arr,(a,b) -> a>b)));
System.out.println(Arrays.toString(s.solution(arr,(a,b) -> a<b)));
// int[] r = s.solution(arr, new StatementStrategy() {
// @Override
// public boolean compare(int a, int b) {
// return a>b;
// }
// });
}
}
public class SelectionSort3 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// BiFunction을 사용한 풀이
public int[] solution(int[] arr, BiFunction<Integer,Integer,Boolean> stmt){
int[] result = arr;
for(int i=0; i<arr.length; i++){
int minidx = i;
for(int j=i; j<arr.length; j++){
if(stmt.apply(arr[minidx],arr[j])) // apply 결과값이 참일때 동작함
minidx = j;
}
int temp = result[i];
result[i] = result[minidx];
result[minidx] = temp;
}
return result;
}
// BiPredicate을 사용한 풀이 BiPredicate도 <Integer,Integer,Boolean>을 사용해야하지만 default값이 boolean이기 때문에 Boolean은 생략 가능
public int[] solution2(int[] arr, BiPredicate<Integer,Integer> stmt){
int[] result = arr;
for(int i=0; i<arr.length; i++){
int minidx = i;
for(int j=i; j<arr.length; j++){
if(stmt.test(arr[minidx],arr[j])) // apply 결과값이 참일때 동작함
minidx = j;
}
int temp = result[i];
result[i] = result[minidx];
result[minidx] = temp;
}
return result;
}
public static void main(String[] args) throws IOException {
SelectionSort3 s = new SelectionSort3();
System.out.print("정렬할 값들을 입력하세요 :");
String[] temp = br.readLine().split(" ");
int[] arr = new int[temp.length];
for(int i=0; i<temp.length; i++){
arr[i] = Integer.parseInt(temp[i]);
}
BiFunction<Integer,Integer,Boolean> biFunction = (a,b) -> a>b;
BiPredicate<Integer,Integer> biPredicate = (a,b) -> a<b;
// BiFunction<Integer,Integer,Boolean> biFunction2 = (a,b) -> a<b;
System.out.println(Arrays.toString(s.solution(arr,biFunction)));
System.out.println(Arrays.toString(s.solution2(arr,biPredicate)));
}
}
참고 자료 : 위키백과(선택정렬)