๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ •๋ ฌ(์‚ฝ์ž…, ๋ฒ„๋ธ”, ํ€ต)

by bba_dda 2020. 8. 17.
๋ฐ˜์‘ํ˜•

์ •๋ ฌ (Sort)

  • n๊ฐœ์˜ ์ˆซ์ž๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ด๋ฅผ ํŠน์ •ํ•œ ๊ธฐ์ค€(์˜ค๋ฆ„์ฐจ์ˆœ, ๋‚ด๋ฆผ์ฐจ์ˆœ ๋“ฑ)์— ๋งž๊ฒŒ ์ •๋ ฌํ•˜์—ฌ ์ถœ๋ ฅํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ๋งค์šฐ ๋‹ค์–‘ํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์กด์žฌํ•˜๊ณ , ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งˆ๋‹ค ์ˆ˜ํ–‰์‹œ๊ฐ„์ด ๋‹ค๋ฅด๋‹ค.

์‚ฝ์ž…์ •๋ ฌ

  • k๋ฒˆ์งธ ์›์†Œ๋ฅผ 1๋ถ€ํ„ฐ k-1๊นŒ์ง€์˜ ์ˆซ์ž์™€ ๋น„๊ตํ•ด ์ ์ ˆํ•œ ์œ„์น˜์— ๋ผ์›Œ ๋„ฃ๊ณ , ๊ทธ ๋’ค์˜ ์ž๋ฃŒ๋ฅผ ํ•œ ์นธ์”ฉ ๋’ค๋กœ ๋ฐ€์–ด๋‚ด๋Š” ๋ฐฉ์‹.

  • ์ž๋ฃŒ๊ตฌ์กฐ์— ๋”ฐ๋ผ์„œ ๋’ค๋กœ ๋ฐ€์–ด๋‚ด๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ํด ์ˆ˜ ์žˆ๋‹ค.

  • ๊ทธ๋ฆฌ๊ณ  ์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด์žˆ์„ ๊ฒฝ์šฐ์— ๋งค์šฐ ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค.

  • ๋ฐ˜๋ฉด์— ์ด๋ฏธ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์— ์ž๋ฃŒ๋ฅผ ํ•˜๋‚˜์”ฉ ์‚ฝ์ž…/์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ตœ๊ณ ์˜ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋œ๋‹ค.

  • ๊ตฌํ˜„์ด ๋งค์šฐ ์‰ฝ๋‹ค.

ํŒŒ์ผ:external/upload.wikimedia.org/Insertion-sort-example-300px.gif

์ด๋ฏธ์ง€ ์ถœ์ฒ˜ - ๋‚˜๋ฌด์œ„ํ‚ค

์ด์ง„ ์‚ฝ์ž… ์ •๋ ฌ

  • ์ด์ง„ ํƒ์ƒ‰์„ ํ™œ์šฉํ•ด์„œ ์ƒˆ๋กœ์šด ์›์†Œ๊ฐ€ ์œ„์น˜ํ•  ๊ณณ์„ ๋ฏธ๋ฆฌ ์ฐพ์•„์„œ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ์‹

  • ์›์†Œ ํฌ๊ธฐ ๋น„๊ตํ•˜๋Š” ๋ถ€๋ถ„์„ logN ์ˆ˜์ค€์œผ๋กœ ๋‚ฎ์ถ”์–ด ์กฐ๊ธˆ ๋” ๋น ๋ฅด๊ฒŒ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

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

  • ์ตœ์•…์˜ ๊ฒฝ์šฐ : O(n^2)

  • ์ตœ์„ ์˜ ๊ฒฝ์šฐ : O(n)

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

  • O(1)

์ฝ”๋“œ

#include<stdio.h>
#include<stdlib.h>

#define MAX_SIZE 100000
int main(void) {
    int list[MAX_SIZE]; int i,j,temp;
    srand((unsigned int)time(NULL));
    for (i = 0;i<MAX_SIZE;i++) list[i] = rand()%MAX_SIZE+1;
    int key;
      for(i=1; i<MAX_SIZE; i++){
        key = list[i]; 
        for(j=i-1; j>=0 && list[j]>key; j--) list[j+1] = list[j]; 
            list[j+1] = key;
      }
    return 0;
}

๋ฒ„๋ธ”์ •๋ ฌ

  • ์„œ๋กœ ์ธ์ ‘ํ•œ ์›์†Œ๋ฅผ ์ฐจ๋ก€๋กœ ๊ฒ€์‚ฌํ•ด ๋‚˜๊ฐ€๋ฉด์„œ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ์‹

    1๋ฒˆ์งธ์™€ 2๋ฒˆ์งธ ์›์†Œ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ •๋ ฌํ•˜๊ณ , 2๋ฒˆ์งธ์™€ 3๋ฒˆ์งธ, ... , n-1๋ฒˆ์งธ์™€ n๋ฒˆ์งธ๋ฅผ ์ •๋ ฌํ•œ ๋’ค, ๋‹ค์‹œ 1๋ฒˆ์งธ์™€ 2๋ฒˆ์งธ ~ n-2๋ฒˆ์งธ์™€ n-1๋ฒˆ์งธ๋ฅผ ๋น„๊ตํ•ด๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹ (์ตœ๋Œ€ n(n-1)/2 ๋ฒˆ ์ •๋ ฌ)

  • 1ํšŒ์ „ ํ•  ๋•Œ ๋งˆ๋‹ค ๋งˆ์ง€๋ง‰ ํ•œ ๊ฐœ๊ฐ€ ์ •๋ ฌ๋˜๋ฏ€๋กœ ์›์†Œ๋“ค์ด ๊ฑฐํ’ˆ์ฒ˜๋Ÿผ ์˜ฌ๋ผ์˜ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์—ฌ์„œ ๋ฒ„๋ธ” ์ •๋ ฌ์ด๋‹ค.

    1ํšŒ์ „ ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์ •๋ ฌ์—์„œ ์ œ์™ธ๋จ

  • ๋Œ€๋ถ€๋ถ„์˜ ์ƒํ™ฉ์—์„œ ์ตœ์•…์˜ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ฃผ์ง€๋งŒ, ์ด๋ฏธ ์ •๋ ฌ๋œ ์ž๋ฃŒ์—์„œ๋Š” ํ•œ ๋ฒˆ๋งŒ ๋Œ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์„ ์˜ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค€๋‹ค.

  • ๊ฐ€์žฅ ์†์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์•Œ๊ณ ๋ฆฌ์ฆ˜์  ๊ด€์ ์—์„œ๋Š” ๋Œ€๋‹จํžˆ ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ์‹์ด๋‹ค.

  • SWAP์ด MOVE๋ณด๋‹ค ๋” ๋ณต์žกํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์˜ ์“ฐ์ด์ง€ ์•Š๋Š”๋‹ค.

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

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

O(n^2)

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

O(1)

#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 100000
int main(void){
    int list[MAX_SIZE]; 
    int i,j,temp;
    srand((unsigned int)time(NULL));
    for (i = 0;i<MAX_SIZE;i++) list[i] = rand()%MAX_SIZE+1;

    for (i=0;i<MAX_SIXE;i++){
        for (j=0;j<MAX_SIZE-i ; j++){
            if(list[j] > list[j+1]){
                //SWAP
                temp = list[j];
                list[j] = list[j+1];
                list[j+1] = temp;      
            } 
        }
    }
    return 0;
}

ํ€ต์ •๋ ฌ

  • 'quick'์ด๋ผ๋Š” ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ํ‰๊ท ์ ์ธ ์ƒํ™ฉ์—์„œ ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ

  • ๊ฑฐ์˜ ๋ชจ๋“  ์–ธ์–ด์—์„œ ์ œ๊ณตํ•˜๋Š” ์ •๋ ฌํ•จ์ˆ˜๋Š” ํ€ต ์ •๋ ฌ ํ˜น์€ ์ด๋ฅผ ๋ณ€ํ˜•ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉ

  • ์ ์ ˆํ•œ ์›์†Œ ํ•˜๋‚˜๋ฅผ pivot์œผ๋กœ ์ •ํ•ด์„œ, ๊ทธ๋ณด๋‹ค ์ž‘์€ ๊ฒƒ์„ ์•ž์œผ๋กœ ๋นผ๋‚ด๊ณ , ํฐ ๊ฒƒ์„ ๋’ค๋กœ ๋ณด๋‚ด์„œ pivot์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์€๊ฒƒ, ํฐ ๊ฒƒ์œผ๋กœ ๋‚˜๋ˆˆ ๋’ค์— ๊ฐ๊ฐ์—์„œ ๋‹ค์‹œ ํ”ผ๋ฒ—์„ ์ •ํ•ด์„œ ๋‚˜๋ˆ„์–ด์ง„ ๊ณต๊ฐ„์˜ ํฌ๊ธฐ๊ฐ€ 0์ด๋‚˜ 1์ด ๋  ๋•Œ ๊นŒ์ง€ ์ •๋ ฌํ•œ๋‹ค.

  • ์ด๋ ‡๊ฒŒ pivot์„ ์žก๊ณ  ์ž‘์€ ์›์†Œ๋“ค์„ ์™ผ์ชฝ์œผ๋กœ, ํฐ ์›์†Œ๋“ค์„ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๋ฐฉ์‹์„ partition step์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ์ด ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ํ€ต์†ŒํŠธ ์˜ˆ์‹œ(์ถœ์ฒ˜-์œ„ํ‚คํ”ผ๋””์•„)

  • ๋‘๊บผ์šด ํ…Œ๋‘๋ฆฌ์•ˆ์˜ 5๊ฐ€ pivot์ด๋‹ค. ํŒŒ๋ž€์ƒ‰์€ pivot๋ณด๋‹ค ์ž‘์€ ์ˆ˜, ๋นจ๊ฐ„์ƒ‰์€ pivot๋ณด๋‹ค ํฐ ์ˆ˜์ด๋‹ค

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

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

  • ์ตœ์•…์˜ ๊ฒฝ์šฐ : O(n^2)

ํ”ผ๋ฒ—์„ ๊ณ„์† ์ตœ๋Œ“๊ฐ’์ด๋‚˜ ์ตœ์†Ÿ๊ฐ’์œผ๋กœ ์žก๋Š” ๊ฒฝ์šฐ

๋”ฐ๋ผ์„œ ํ”ผ๋ฒ—์„ ๋žœ๋ค์œผ๋กœ ์ •ํ•˜๊ฑฐ๋‚˜, ๋ช‡ ๊ฐœ๋ฅผ ๋ฝ‘์•„ ์ค‘์•™๊ฐ’์œผ๋กœ ์ •ํ•˜๋Š” ๋“ฑ์˜ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

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

O(logN)

์ฝ”๋“œ

#include <stdio.h>
#define MAX_SIZE 100000
#define SWAP(x,y,t) ( (t)=(x), (x)=(y), (y)=(t))

int list[MAX_SIZE];
int partition(int list[], int left, int right) { //๋ถ„ํ•  ์•Œ๊ณ ๋ฆฌ์ฆ˜  
    int pivot, temp, low, high;
    low = left;
    high = right + 1;
    pivot = list[left]; //์ œ์ผ ์™ผ์ชฝ์›์†Œ๋ฅผ pivot์œผ๋กœ ์„ค์ • 
    do {
        do low++; // ํ”ผ๋ด‡ ๋‹ค์Œ๋ถ€ํ„ฐ low 
        // list[low] < pivot ์ผ ๋•Œ low ์ฆ๊ฐ€  
        while (low <= right && list[low] < pivot);
        do high--; //list[right] ๋ถ€ํ„ฐ ์‹œ์ž‘ 
        // list[high] > pivot์ผ ๋•Œ high ๊ฐ์†Œ  
        while (high >= left && list[high] > pivot);
        if (low < high) SWAP(list[low], list[high], temp);
    } while (low < high); 
    SWAP(list[left], list[high], temp);
    return high; //pivot index 
}
void quick_sort(int list[], int left, int right)
{
    if (left<right) {
        int q = partition(list, left, right); //pivot index
        quick_sort(list, left, q - 1); //ํ”ผ๋ด‡ ์ œ์™ธํ•˜๊ณ  ๋‹ค์‹œ ํ€ต์†ŒํŠธ  
        quick_sort(list, q + 1, right);
    }
}
int main(void) {
    int i;
    srand(time(NULL));
    for (i = 0; i < MAX_SIZE; i++)
        list[i] = rand() % MAX_SIZE+1;
    quick_sort(list, 0, MAX_SIZE - 1);

    return 0;
}

์ฐธ๊ณ ์ž๋ฃŒ

[https://namu.wiki/w/%EC%A0%95%EB%A0%AC%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98](https://namu.wiki/w/์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜)

https://gmlwjd9405.github.io/2018/05/06/algorithm-bubble-sort.html

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€