[c++] ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ๋…๊ณต๋ถ€ :: ์ •๋ ฌ (์„ ํƒ ์ •๋ ฌ, ๋ฒ„๋ธ” ์ •๋ ฌ, ์‚ฝ์ž… ์ •๋ ฌ)

์„ ํƒ ์ •๋ ฌ

๊ฐœ๋…

 max, min ์ •๋ ฌ์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ ์›์†Œ๊นŒ์ง€ ํ›‘์œผ๋ฉด์„œ ์ตœ์†Œ๋‚˜ ์ตœ๋Œ€๋ฅผ ์ฐพ์•„์„œ ๋ฆฌ์ŠคํŠธ์˜ ์ฒ˜์Œ์ด๋‚˜ ๋์— ๋„ฃ๊ณ  ํ•ด๋‹น ์›์†Œ๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ์›์†Œ์— ๋Œ€ํ•ด ๋‹ค์‹œ ์ •๋ ฌ์„ ์‹œํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

๋ฌด์ž‘์œ„๋กœ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ์˜ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ํƒ์ƒ‰ํ•œ ํ›„, ๊ฐ€์žฅ ํฐ ์ˆ˜๋ฅผ ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ์™€ ๊ตํ™˜ํ•œ๋‹ค.

 

 

๊ทธ ํ›„ ๋งˆ์ง€๋ง‰ ์›์†Œ๋ฅผ ์ œ์™ธํ•œ ์ฑ„๋กœ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ํƒ์ƒ‰ํ•œ ํ›„, ๊ฐ€์žฅ ํฐ ์ˆ˜๋ฅผ ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ์™€ ๊ตํ™˜ํ•œ๋‹ค.

 

 

๊ตฌํ˜„

์˜์‚ฌ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

(min ์ •๋ ฌ)
for i=0 to n:
    a[i]๋ถ€ํ„ฐ a[n-1]๊นŒ์ง€ ์ฐจ๋ก€๋กœ ๋น„๊ตํ•˜์—ฌ ์ตœ์†Œ๊ฐ’์ด ์žˆ๋Š” a[j]๋ฅผ ์ฐพ๋Š”๋‹ค.
a[i]์™€ a[j]๋ฅผ ๋ฐ”๊พผ๋‹ค.

(max ์ •๋ ฌ)
for i=0 to n:
    a[0]๋ถ€ํ„ฐ a[n-i-1]๊นŒ์ง€ ์ฐจ๋ก€๋กœ ๋น„๊ตํ•˜์—ฌ ์ตœ๋Œ€๊ฐ’์ด ์žˆ๋Š” a[j]๋ฅผ ์ฐพ๋Š”๋‹ค.
a[n-i-1]๊ณผ a[j]๋ฅผ ๋ฐ”๊พผ๋‹ค.

 

c++๋กœ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

void selectionSort(int* arr) {
    cout << "selection sort(min, max sort)" << endl;
    for (int i = 0; i < arr_size; i++) {
        int max_idx = 0;
        for (int j = 0; j < arr_size - i; j++) {
            if (arr[max_idx] < arr[j])
                max_idx = j; // ์ตœ๋Œ€๊ฐ’ ์ฐพ๊ธฐ
        }
        swap(arr, max_idx, arr_size - 1 - i);
        // ์ตœ๋Œ€๊ฐ’ ๋’ค๋กœ ์˜ฎ๊ฒจ๋‘๊ธฐ
    }
}

 

์‹œ๊ฐ„ ๋ณต์žก๋„

์„ ํƒ ์ •๋ ฌ์€ ๋ฆฌ์ŠคํŠธ์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋“ค์–ด๊ฐ„ ๋ฐ˜๋ณต๋ฌธ์ด 2๊ฐœ๋‚˜ ์žˆ์œผ๋ฏ€๋กœ O(n^2)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค. ์ตœ์„ , ์ตœ์•…, ํ‰๊ท  ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(n^2)์œผ๋กœ ๊ฐ™๋‹ค.

 

์ •ํ™•ํžˆ๋Š” ๋น„๊ต ํšŸ์ˆ˜๊ฐ€ n(n-1)/2๋ฒˆ์œผ๋กœ O(n^2)์ด๊ณ  ์ด๋™ ํšŸ์ˆ˜๊ฐ€ ์ตœ๋Œ€3(n-1)์ด๋ฏ€๋กœ ์ „์ฒด ๋ณต์žก๋„๊ฐ€ O(n^2)์ด๋‹ค.

 

ํŠน์ง•

  • ๋ถˆ์•ˆ์ • ์ •๋ ฌ์ด๋‹ค.
    • ex) 5345268 => 5์˜ ์œ„์น˜๊ฐ€ ๋’ค๋ฐ”๋€๋‹ค.

 

๋ฒ„๋ธ” ์ •๋ ฌ

๊ฐœ๋…

๋ฒ„๋ธ” ์ •๋ ฌ์€ ์•ž์—์„œ๋ถ€ํ„ฐ ๊ฑฐํ’ˆ์ด ํŠ€๋“ฏ์ด ํŠ•๊ฒจ์„œ ํฐ ์ˆ˜๋ฅผ ๋’ค๋กœ ๋ณด๋‚ด๋Š” ์ •๋ ฌ์ด๋‹ค.

 

 

๋ฌด์ž‘์œ„๋กœ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‘ ์›์†Œ์”ฉ ์ง์„ ์ง€์–ด์„œ ๋Œ€์†Œ๋ฅผ ๋น„๊ตํ•œ๋‹ค.

 

 

์•ž์— ๋ฐฐ์น˜๋œ ์ˆ˜๊ฐ€ ๋’ค์˜ ์ˆ˜๋ณด๋‹ค ํฌ๋ฉด ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พผ๋‹ค. ํฐ ์ˆ˜๊ฐ€ ๋’ค๋กœ ๊ฐ€๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

 

 

์ด๋ ‡๊ฒŒ ๋ฐ˜๋ณตํ•˜๋‹ค๋ณด๋ฉด ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ€์žฅ ํฐ ์ˆ˜์ธ 9๊ฐ€ ๋งจ ๋’ค๋กœ ๋ฐ€๋ ค๋‚˜๊ฒŒ ๋œ๋‹ค.

 

 

๊ทธ ํ›„์—๋Š” 9๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‚จ์€ ์›์†Œ์— ํ•œํ•ด์„œ ๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋น„๊ตํ•œ๋‹ค.

 

๊ตฌํ˜„

์˜์‚ฌ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

for i=0 to n:
    for j=0 to n-i:
        arr[i]์™€ arr[i+1]์„ ๋น„๊ตํ•œ๋‹ค. arr[i]๊ฐ€ ๋” ํฌ๋ฉด ๋‘ ์ˆ˜๋ฅผ ๊ตํ™˜ํ•œ๋‹ค.

 

c++๋กœ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

void swap(int* arr, int idx1, int idx2) {
    int tmp = arr[idx1];
    arr[idx1] = arr[idx2];
    arr[idx2] = tmp;
}

void bubbleSort(int* arr) {
    cout << "bubble sort" << endl;
    for (int i = 0; i < arr_size-1; i++) {
        for (int j = 0; j < arr_size - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(arr, j, j + 1); // ์ด์›ƒํ•œ ๋‘ ๊ฐœ์˜ ์š”์†Œ ๋น„๊ต
            }
        }
    }
}

 

์‹œ๊ฐ„ ๋ณต์žก๋„

๋ฒ„๋ธ” ์ •๋ ฌ์€ ๋ฆฌ์ŠคํŠธ์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋“ค์–ด๊ฐ„ ๋ฐ˜๋ณต๋ฌธ์ด 2๊ฐœ๋‚˜ ์žˆ์œผ๋ฏ€๋กœ O(n^2)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค. ์ตœ์„ , ์ตœ์•…, ํ‰๊ท  ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(n^2)์œผ๋กœ ๊ฐ™๋‹ค.

 

์ •ํ™•ํžˆ๋Š” ๋น„๊ต ํšŸ์ˆ˜๊ฐ€n(n-1)/2 ๋ฒˆ์œผ๋กœ O(n^2)์ด๊ณ  ์ด๋™ ํšŸ์ˆ˜๊ฐ€ ์ตœ๋Œ€ O(n^2)์ด๋ฏ€๋กœ ์ „์ฒด ๋ณต์žก๋„๊ฐ€ O(n^2)์ด๋‹ค.

 

ํŠน์ง•

  • ์•ˆ์ • ์ •๋ ฌ์ด๋‹ค.

 

์‚ฝ์ž… ์ •๋ ฌ

๊ฐœ๋…

์‚ฝ์ž… ์ •๋ ฌ์€ ์ •๋ ฌ๋œ ์š”์†Œ๋“ค๊ณผ ํ˜„์žฌ ์š”์†Œ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ž์‹ ์˜ ์œ„์น˜๋ฅผ ์ฐพ์•„ ์‚ฝ์ž…ํ•˜๋Š” ์ •๋ ฌ์ด๋‹ค.

 

 

๋ฌด์ž‘์œ„๋กœ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ์˜ ์ฒซ๋ฒˆ์งธ ์š”์†Œ๋Š” ์ด๋ฏธ ์ •๋ ฌ๋œ ์š”์†Œ๋กœ ๋ณธ๋‹ค.

 

 

์ •๋ ฌํ•  ์š”์†Œ๋ฅผ ์ด๋ฏธ ์ •๋ ฌ๋œ ์š”์†Œ์™€ ๋น„๊ตํ•˜์—ฌ ๋งž๋Š” ์œ„์น˜์— ์‚ฝ์ž…ํ•œ๋‹ค.

 

 

์ •๋ ฌ๋˜์ง€ ์•Š์€ ์š”์†Œ๋ฅผ ๋งž๋Š” ์œ„์น˜๋ฅผ ์ฐพ์•„ ์‚ฝ์ž…ํ•˜๋Š” ์‹์œผ๋กœ ์ •๋ ฌ๋œ ์š”์†Œ๋กœ ๋งŒ๋“œ๋Š” ์ž‘์—…์„ ๋ฐ˜๋ณตํ•˜๋‹ค๋ณด๋ฉด ์ „์ฒด ์š”์†Œ๊ฐ€ ์ •๋ ฌ๋œ๋‹ค.

 

๊ตฌํ˜„

์˜์‚ฌ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

for i=1 to n:
    for j=i-1 to 0:
        arr[j]๊ฐ€ arr[i]๋ณด๋‹ค ์ž‘๋‹ค๋ฉด j+1์˜ ์œ„์น˜์— arr[i]๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.

 

c++๋กœ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

void insert(int* arr, int idx, int data_idx) {
    if (idx == data_idx)
        return;

    int tmp = arr[data_idx];
    for (int i = data_idx-1; i >= idx; i--) {
        arr[i + 1] = arr[i];
    }
    arr[idx] = tmp;
}

void insertionSort(int* arr) {
    cout << "insertion sort" << endl;
    for (int i = 1; i < arr_size; i++) { // ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์š”์†Œ
        int idx = i;
        for (int j = i-1; j >= 0; j--) { // ์ •๋ ฌ๋œ ์š”์†Œ
            if (arr[j] > arr[i]) {
                idx = j;
            }
            else
                break;
        }
        insert(arr, idx, i);
    }
}

 

์‹œ๊ฐ„ ๋ณต์žก๋„

 ์‚ฝ์ž… ์ •๋ ฌ์€ ์—ญ์ˆœ ์ •๋ ฌ๋˜์–ด์žˆ๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ (1+2+...+n-1)๋ฒˆ ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด๋™๋„ ๋น„๊ต์™€ ๊ฐ™์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” n(n-1)/2 ์ฆ‰ O(n^2)์ด๋‹ค.

 

 ์ตœ์„ ์€ ์ด๋ฏธ ์ •๋ ฌ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ์ด๋ฉฐ, ๋‘๋ฒˆ์งธ ๋ฐ˜๋ณต๋ฌธ์ด ํ•ญ์ƒ 1๋ฒˆ์”ฉ๋งŒ ์‹คํ–‰๋˜๋ฏ€๋กœ ๋น„๊ตํšŸ์ˆ˜๋Š” n-1 ๋ฒˆ์ด๋ฉฐ ์ด๋™ํšŸ์ˆ˜๋Š” 0๋ฒˆ์ด๋ฏ€๋กœ O(n)์ด๋‹ค.

 

ํŠน์ง•

  • ์•ˆ์ • ์ •๋ ฌ์ด๋‹ค.
๋ฐ˜์‘ํ˜•