์๊ณ ๋ฆฌ์ฆ์ ์์ํ๋ฉด ๋๋ถ๋ถ์ ์ฑ ์ ๊ฐ์ฅ ์์์ ์๊ฐ๋๋ Selection Sort. ์ ํ ์ ๋ ฌ์ ๋ํด์ ์์๋ณด์.
์ ํ ์ ๋ ฌ
์ ํ ์ ๋ ฌ์ ๋ฐฐ์ด์ ์์ ์ค ๊ฐ์ฅ ์์(ํฐ) ๊ฐ์ ๋ฐฐ์ด์ ๋์ผ๋ก ๋ณด๋ด๋ ์์ ์ ๋ฐ๋ณตํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๊ฐ๋จํ ์ปจ์ ์ธ ๋งํผ ํจ์จ์ฑ์ ๋จ์ด์ง ์ ์์ผ๋ ์ ์ ์์ ๋ฐ์ดํฐ์์๋ ํจ๊ณผ์ ์ผ ์ ์๋ค.
์ ๋ ฌ ๊ณผ์
- ์ฃผ์ด์ง ๋ฆฌ์คํธ์์ ์ต์๊ฐ์ ์ฐพ๊ธฐ
- ๊ทธ ๊ฐ์ ๋งจ ์์ ๊ฐ๊ณผ ๊ต์ฒด
- ์ฒ์ ๋งจ ์์น๋ฅผ ๋บ ๋๋จธ์ง๋ฅผ ์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๊ต์ฒด
์ ๊ณผ์ ์ผ๋ก ์ ๋ ฌ์ด ์ด๋ฃจ์ด์ง๋ค.
์๊ฐํด๋ณด์.
๋ง์ฝ [9, 1, 6, 8 ,4, 3, 2, 0] ์ด๋ผ๋ ๋ฐฐ์ด์ด ์๋ค๊ณ ์๊ฐํด๋ณด์.
- ๋ฐฐ์ด : [9, 1, 6, 8, 4, 3, 2, 0] ์ต์๊ฐ : 0
- ๋ฐฐ์ด : [0, 1 ,6 ,8 ,4 ,3 ,2, 9] ์ต์๊ฐ : 1
- ๋ฐฐ์ด : [0, 1, 6, 8, 4, 3, 2, 9] ์ต์๊ฐ : 2
- ๋ฐฐ์ด : [0, 1, 2 ,8 ,4 ,3 ,6 ,9] ์ต์๊ฐ : 3
- ๋ฐฐ์ด : [0, 1 ,2, 3, 4, 8, 6, 9] ์ต์๊ฐ : 6
- ๋ฐฐ์ด : [0, 1, 2, 3 ,4 ,8 ,6 ,9] ์ต์๊ฐ : 8
- ๋ฐฐ์ด : [0, 1, 2 ,3, 4, 6, 8, 9]
์คํ ์๊ฐ
n^2์ ์คํ ์๊ฐ
๊ตฌํ ํ๊ธฐ
์ฐ์ ๊ตฌํํ๊ธฐ ์์ ๋ฉ์๋๋ฅผ ๋จผ์ ์๊ฐํด๋ณด์.
์์ ๊ณผ์ ์ ๋ณด๋ฉด ์ฐ๋ฆฌ๋ ์ฒซ ๋ฒ์งธ๋ก ์ฃผ์ด์ง ๋ฐฐ์ด์ ์ต์ ๊ฐ์ ์ฐพ๋ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ผ ํ๊ณ , ๋ ๋ฒ์งธ๋ก ํด๋น ์ธ๋ฑ์ค์ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
๋ํ ์ ๋ ฌ์ด ๋๋ ์ธ๋ฑ์ค๋ ๊ฑด๋ ๋ฐ์ด์ผ ํ๋ค.
๊ทธ๋ผ 3๊ฐ์ ๋ฉ์๋๋ฅผ ๋ง๋ค๋ฉด ๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
- ๋ฐฐ์ด ์ต์๊ฐ ์ฐพ๋
findLowestIndex()
๋ฉ์๋ - ์ธ๋ฑ์ค๋ผ๋ฆฌ ๊ฐ์ ๋ณ๊ฒฝํ๋
swap()
๋ฉ์๋ - ์ค์ง์ ์ผ๋ก ์ ๋ ฌ์ด ๋๋
selectionSort()
๋ฉ์๋
public class SelectionSort {
public static void main(String[] args) {
int[] arr = {6, 8, 9, 2, 5, 1, 4, 3, 7, 0};
/*
* 1. ๋ฐฐ์ด ์ธ๋ฑ์ค ์ต์๊ฐ ์ฐพ๊ธฐ
* 2. ๋ฐฐ์ด ์ธ๋ฑ์ค ์ฒซ๋ฒ์งธ ๊ฐ๊ณผ ๋ณ๊ฒฝ*/
selectionSort(arr);
System.out.println(Arrays.toString(arr));
}
private static void swap(int[] arr, int idx1, int idx2) {
int temp = arr[idx1];
arr[idx1] = arr[idx2];
arr[idx2] = temp;
}
private static int findLowestIndex(int[] arr, int start) {
int lowest = start;
for (int i = start; i < arr.length; i++) {
if(arr[lowest] > arr[i]) {
lowest = i;
}
}
return lowest;
}
private static void selectionSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
int targetIndex = findLowestIndex(arr, i);
swap(arr, i, targetIndex);
}
}
}
์ ์ฒด ์์ค ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
swap()
private static void swap(int[] arr, int idx1, int idx2) {
int temp = arr[idx1];
arr[idx1] = arr[idx2];
arr[idx2] = temp;
}
๊ฐ๋จํ๊ณ ์ ์๋ ค์ง swap() ๋ฉ์๋์ด๋ค.
ํน๋ณํ ์ค๋ช
์์ด ๋์ด๊ฐ๊ฒ ๋ค.
findLowestIndex
private static int findLowestIndex(int[] arr, int start) {
int lowest = start;
for (int i = start; i < arr.length; i++) {
if(arr[lowest] > arr[i]) {
lowest = i;
}
}
return lowest;
}
ํด๋น ๋ฉ์๋์์๋ arr[]
๋ฐฐ์ด๊ณผ ์์ ์ธ๋ฑ์ค ์์น์ธ start
๋ณ์๋ฅผ ๋ฐ๋๋ค.
์ต์ด ๊ฐ์ฅ ์์ ์๋ฅผ ๊ฐ๊ณ ์๋ arr ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ start ๋ณ์๋ก ์ง์ ํด์ฃผ๊ณ , arr์ ๊ธธ์ด ๋งํผ ๋ฐ๋ณต์ ๋๋ฉฐ arr[lowest]
์ ๋ฐ๋ณต ์ธ๋ฑ์ค์ธ arr[i]
์ ๋น๊ตํด์ ๋ ์์ ๊ฐ์ ๊ฐ๊ณ ์๋ ์ธ๋ฑ์ค๊ฐ ์๋ก์ด lowest ๋ณ์์ ๋ด๊ธฐ๊ฒ ๋๋ค.
SelectionSort
์ฐ๋ฆฌ๋ ์ง๊ธ๊น์ง ๊ฐ์ฅ ์์ ์ธ๋ฑ์ค๋ฅผ ์ฐพ์๊ณ , ๊ฐ์ฅ ์์ ์ธ๋ฑ์ค์ ๋ฐฐ์ด ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค๋ฅผ ๋ณ๊ฒฝ์์ผ์ฃผ๋ ๋ฉ์๋๊น์ง ๋ง๋ค์๋ค.
์ด์ ์ค์ง์ ์ผ๋ก ๋ฐ๋ณต์ ๋๋ฉฐ ์ ๋ ฌ์ ์ํํ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด ๋ณด์.
private static void selectionSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
int targetIndex = findLowestIndex(arr, i);
swap(arr, i, targetIndex);
}
}
๋ฐ๋ณต์ arr์ 0๋ฒ์งธ ์ธ๋ฑ์ค๋งํผ ๋๋ฉฐ 0๋ฒ์งธ ์ธ๋ฑ์ค๋ฅผ ์์์ผ๋ก findLowestIndex
์ swap
์ ์ฐจ๋ก๋๋ก ์คํํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฒซ ๋ฒ์จฐ ๋ฐ๋ณต์ด ๋๋๋ฉด arr์ 0๋ฒ์งธ ์ธ๋ฑ์ค์ ๊ฐ์๋ ์ฃผ์ด์ง ๋ฐฐ์ด์ ์ต์๊ฐ์ ๋ด๊ณ ์์ผ๋ฏ๋ก ํด๋น ์ธ๋ฑ์ค๋ง ์ ์ธ์ํจ ํ ๋ค์ iteration์ ๋๋ค.
๋๊ธ