๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’ป Computer Science/- Data Structure, Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„] Java๋กœ ์„ ํƒ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ํ•˜๊ธฐ

by Wonit 2021. 1. 13.

์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹œ์ž‘ํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ์ฑ…์— ๊ฐ€์žฅ ์•ž์—์„œ ์†Œ๊ฐœ๋˜๋Š” Selection Sort. ์„ ํƒ ์ •๋ ฌ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

์„ ํƒ ์ •๋ ฌ

์„ ํƒ ์ •๋ ฌ์€ ๋ฐฐ์—ด์˜ ์›์†Œ ์ค‘ ๊ฐ€์žฅ ์ž‘์€(ํฐ) ๊ฐ’์„ ๋ฐฐ์—ด์˜ ๋์œผ๋กœ ๋ณด๋‚ด๋Š” ์ž‘์—…์„ ๋ฐ˜๋ณตํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

๊ฐ„๋‹จํ•œ ์ปจ์…‰์ธ ๋งŒํผ ํšจ์œจ์„ฑ์€ ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋‚˜ ์ ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ์—์„œ๋Š” ํšจ๊ณผ์ ์ผ ์ˆ˜ ์žˆ๋‹ค.

์ •๋ ฌ ๊ณผ์ •

  1. ์ฃผ์–ด์ง„ ๋ฆฌ์ŠคํŠธ์—์„œ ์ตœ์†Œ๊ฐ’์„ ์ฐพ๊ธฐ
  2. ๊ทธ ๊ฐ’์„ ๋งจ ์•ž์˜ ๊ฐ’๊ณผ ๊ต์ฒด
  3. ์ฒ˜์Œ ๋งจ ์œ„์น˜๋ฅผ ๋บ€ ๋‚˜๋จธ์ง€๋ฅผ ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ต์ฒด

์˜ ๊ณผ์ •์œผ๋กœ ์ •๋ ฌ์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

์ƒ๊ฐํ•ด๋ณด์ž.

๋งŒ์•ฝ [9, 1, 6, 8 ,4, 3, 2, 0] ์ด๋ผ๋Š” ๋ฐฐ์—ด์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

  1. ๋ฐฐ์—ด : [9, 1, 6, 8, 4, 3, 2, 0] ์ตœ์†Œ๊ฐ’ : 0
  2. ๋ฐฐ์—ด : [0, 1 ,6 ,8 ,4 ,3 ,2, 9] ์ตœ์†Œ๊ฐ’ : 1
  3. ๋ฐฐ์—ด : [0, 1, 6, 8, 4, 3, 2, 9] ์ตœ์†Œ๊ฐ’ : 2
  4. ๋ฐฐ์—ด : [0, 1, 2 ,8 ,4 ,3 ,6 ,9] ์ตœ์†Œ๊ฐ’ : 3
  5. ๋ฐฐ์—ด : [0, 1 ,2, 3, 4, 8, 6, 9] ์ตœ์†Œ๊ฐ’ : 6
  6. ๋ฐฐ์—ด : [0, 1, 2, 3 ,4 ,8 ,6 ,9] ์ตœ์†Œ๊ฐ’ : 8
  7. ๋ฐฐ์—ด : [0, 1, 2 ,3, 4, 6, 8, 9]

์‹คํ–‰ ์‹œ๊ฐ„

n^2์˜ ์‹คํ–‰ ์‹œ๊ฐ„

๊ตฌํ˜„ ํ•˜๊ธฐ

์šฐ์„  ๊ตฌํ˜„ํ•˜๊ธฐ ์•ž์„œ ๋ฉ”์„œ๋“œ๋ฅผ ๋จผ์ € ์ƒ๊ฐํ•ด๋ณด์ž.


์œ„์˜ ๊ณผ์ •์„ ๋ณด๋ฉด ์šฐ๋ฆฌ๋Š” ์ฒซ ๋ฒˆ์งธ๋กœ ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์˜ ์ตœ์†Œ ๊ฐ’์„ ์ฐพ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ๋กœ ํ•ด๋‹น ์ธ๋ฑ์Šค์™€ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.


๋˜ํ•œ ์ •๋ ฌ์ด ๋๋‚œ ์ธ๋ฑ์Šค๋Š” ๊ฑด๋„ˆ ๋›ฐ์–ด์•ผ ํ•œ๋‹ค.


๊ทธ๋Ÿผ 3๊ฐœ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค๋ฉด ๋  ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

 

  1. ๋ฐฐ์—ด ์ตœ์†Œ๊ฐ’ ์ฐพ๋Š” findLowestIndex() ๋ฉ”์„œ๋“œ
  2. ์ธ๋ฑ์Šค๋ผ๋ฆฌ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” swap() ๋ฉ”์„œ๋“œ
  3. ์‹ค์งˆ์ ์œผ๋กœ ์ •๋ ฌ์ด ๋˜๋Š” 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์„ ๋ˆ๋‹ค.

๋Œ“๊ธ€