sort jihoon - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

์‚ฝ์ž… ์ •๋ ฌ(Insertion sort)

  • ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๋ฐฐ์—ด์— ์•„์ง ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์›์†Œ์˜ ๋“ค์–ด๊ฐˆ ์œ„์น˜๋ฅผ ์ฐพ์•„ ์‚ฝ์ž…ํ•˜๋Š” ์ •๋ ฌ
  • ์ •๋ ฌ๋˜์–ด ์žˆ์„ ๋•Œ ๊ฐ€์žฅ ํšจ์œจ์ด ๋†’๋‹ค. ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๋ฐฐ์—ด์˜ ๊ฐ€์žฅ ๋์— ์žˆ๋Š” ์›์†Œ๋งŒ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์›์†Œ์™€ ๋น„๊ตํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. O(N)
  • ์‹œ๊ฐ„ ๋ณต์žก๋„
    • ํ‰๊ท  : O(N^2)
    • ์ตœ์„  : O(N)
    • ์ตœ์•… : O(N^2)

image3

// ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
void insertionSort(int arr[], int N)
{
    for (int i = 1; i < N; i++)
    {
        int key = arr[i];
        for (int j = i-1; j >= 0; j--)
        {
            if (key < arr[j])
                arr[j+1] = arr[j];
            else
                break;
        }
        arr[j+1] = key;
    }
}

์„ ํƒ ์ •๋ ฌ(Selection sort)

  • ๋งค๋ฒˆ ๊ทธ ๋•Œ์˜ ๊ฐ€์žฅ ์ž‘์€(ํฐ) ์›์†Œ์˜ index๋ฅผ ์ฐพ์•„๋‚ด์–ด ํ˜„์žฌ index์˜ ์›์†Œ์™€ swapํ•˜๋Š” ์ •๋ ฌ
  • ์‹œ๊ฐ„ ๋ณต์žก๋„
    • ํ‰๊ท  : O(N^2)
    • ์ตœ์„  : O(N^2)
    • ์ตœ์•… : O(N^2)

์ฝ”๋“œ

void selectionSort(int arr[], int N) {

    // ๋งˆ์ง€๋ง‰ ์ˆซ์ž๋Š” ์ž๋™์œผ๋กœ ์ •๋ ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— (์ˆซ์ž ๊ฐœ์ˆ˜-1) ๋งŒํผ ๋ฐ˜๋ณตํ•œ๋‹ค.
    for(int i = 0; i < N-1; i++) {
    int minIndex = i;

        // ์ตœ์†Ÿ๊ฐ’์„ ํƒ์ƒ‰ํ•œ๋‹ค.
        for(int j = i+1; j < N; j++) {
            if(arr[j] < arr[minIndex])
                minIndex = j;
        }

        // ์ตœ์†Ÿ๊ฐ’์ด ์ž๊ธฐ ์ž์‹ ์ด๋ฉด swap ํ•˜์ง€ ์•Š๋Š”๋‹ค.
        if(i != minIndex)
            swap(arr[i], arr[minIndex]);
    }
}

๋ฒ„๋ธ” ์ •๋ ฌ(Bubble sort)

  • ์„œ๋กœ ์ธ์ ‘ํ•œ ๋‘ ์›์†Œ๋ฅผ ๊ฒ€์‚ฌํ•˜์—ฌ ์ •๋ ฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ์ธ์ ‘ํ•œ 2๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ•˜์—ฌ ํฌ๊ธฐ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด swapํ•œ๋‹ค.
  • ์‹œ๊ฐ„ ๋ณต์žก๋„
    • ํ‰๊ท  : O(N^2)
    • ์ตœ์„  : O(N^2)
    • ์ตœ์•… : O(N^2)

์ฝ”๋“œ

void bubble_sort(int arr[], int N){
    for(int i = N-1; i > 0; i--) {
        for(j=0; j < i; j++) {
            // j๋ฒˆ์งธ์™€ j+1๋ฒˆ์งธ์˜ ์š”์†Œ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด swap
            if(list[j] < list[j+1]) {
                swap(arr[j], arr[j+1]);
            }
        }
    }
}

ํ€ต ์ •๋ ฌ(quick sort)

  • pivot์˜ ์œ„์น˜๋ฅผ ์ฐพ์•„๊ฐ€๋ฉด์„œ ์ง„ํ–‰๋˜๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • pivot๋ณด๋‹ค ์ž‘์€ ํ˜น์€ ํฐ ์›์†Œ์˜ ๊ฐœ์ˆ˜๋งŒ ์•Œ๋ฉด pivot์˜ ์ตœ์ข… ์œ„์น˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ€์žฅ ๋น ๋ฅธ ์ •๋ ฌ
  • ์ด๋ฏธ ์ •๋ ฌ๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ **O(N^2)**๋กœ, ํšจ์œจ์ด ๊ฐ€์žฅ ๋‚ฎ๋‹ค.
    • ์žฌ๊ท€ ํ•จ์ˆ˜๊ฐ€ 1๊ณผ N-1, N-1์ด ๋‹ค์‹œ 1๊ณผ N-2, ... ๋ถ„ํ• ์ด N๋งŒํผ ์ผ์–ด๋‚œ๋‹ค.
    • N-1 + N-2 + N-3 + ... + 1 = (N-1)*N/2   =>   O(N^2)
  • divide and conquer(๋ถ„ํ•  ์ •๋ณต) ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„๋œ๋‹ค.(์žฌ๊ท€ ํ•จ์ˆ˜)
  • in-place ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜(๊ทธ ์ž๋ฆฌ์—์„œ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜)
  • cache hit rate๊ฐ€ ์ข‹๋‹ค.
    • pivot์„ ์ด์šฉํ•˜๋ฏ€๋กœ ์‹œ๊ฐ„ ์ง€์—ญ์„ฑ ๋†’๊ณ , ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐฐ์—ด์— ์ ‘๊ทผํ•˜๋ฉด์„œ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณต๊ฐ„ ์ง€์—ญ์„ฑ์ด ๋†’๋‹ค.
  • ์‹œ๊ฐ„ ๋ณต์žก๋„
    • ํ‰๊ท  : O(NlogN)
    • ์ตœ์„  : O(NlogN)
    • ์ตœ์•… : O(N^2)
  • ๊ณต๊ฐ„ ๋ณต์žก๋„ : O(logN) ~ O(N)
    • ํ€ต ์ •๋ ฌ์—์„œ๋Š” ์žฌ๊ท€์ ์ธ ํ˜ธ์ถœ์„ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ณ„๋„๋กœ ํ•„์š”ํ•˜๋‹ค. ์Šคํƒ์— ์†Œ๋ชจ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋Š” ์žฌ๊ท€ ํ•จ์ˆ˜์˜ ๊นŠ์ด์™€ ๋น„๋ก€ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ถ„ํ• ์ด ์ด์ƒ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฒฝ์šฐ O(logN)์˜ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์†Œ์š”๋œ๋‹ค. ์ตœ์•…์˜ ๊ฒฝ์šฐ, ์ฆ‰ ๋ถ„ํ• ์ด ํ•œ์ชฝ์œผ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๊ฒฝ์šฐ์—๋Š” O(N)์˜ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค

์ฝ”๋“œ

์ •ํ•ด์ง„ pivot๋ณด๋‹ค ์ž‘์€(๋˜๋Š” ํฐ) ์›์†Œ๊ฐ€ ๋ช‡ ๊ฐœ์ธ์ง€ ์•Œ๋ฉด ํ•ด๋‹น pivot์— ํ•ด๋‹นํ•˜๋Š” ์›์†Œ๊ฐ€ ์ •๋ ฌํ–ˆ์„ ๋•Œ ๋ช‡ ๋ฒˆ์งธ ์œ„์น˜์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์ด๋‹ค. left๊ฐ€ start+1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜๋ฉด ์›์†Œ๊ฐ€ 2๊ฐœ์ธ ๊ฒฝ์šฐ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์—, start๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.

while (arr[left] <= pivot && left < end)์—๋งŒ left < end ์กฐ๊ฑด์ด ์žˆ๋Š” ์ด์œ ๋Š” while(pivot < arr[right])์—์„œ๋Š” ํ•ญ์ƒ right๊ฐ€ pivot์œ„์น˜์— ๊ฐ€๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น while์ด ์ข…๋ฃŒ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ฒฐ๊ตญ ์ตœ์ƒ์œ„ while์ด ์ข…๋ฃŒ๋œ ํ›„์˜ right๋Š” ํ•ญ์ƒ pivot๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ–๋Š” ๋ถ€๋ถ„ ์ง‘ํ•ฉ์˜ ๋งˆ์ง€๋ง‰ index๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ตœ์ƒ์œ„ while๋ฌธ ๋ฐ–์—์„œ pivot์˜ ์œ„์น˜์ธ start์™€ right(pivot๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ–๋Š” ๋ถ€๋ถ„ ์ง‘ํ•ฉ์˜ ๋งˆ์ง€๋ง‰ index)์™€ swapํ•˜๊ฒŒ ๋˜๊ณ , pivot ์–‘์ชฝ์œผ๋กœ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

void quickSort(int arr[], int start, int end)
{
    if (start >= end)
        return;

    int pivot = arr[start];

    int left = start;
    int right = end;

    while (left < right)
    {
        while (arr[left] <= pivot && left < end)
            left++;
        while (pivot < arr[right])
            right--;

        if (left < right)
            swap(arr[left], arr[right]);
    }

    swap(arr[start], arr[right]);

    quickSort(arr, start, right - 1);
    quickSort(arr, right + 1, end);
}

ํ•ฉ๋ณ‘ ์ •๋ ฌ(Merge sort)

  • 'divide-and-conquer'(์žฌ๊ท€) ๋ฐ ๊ฒฐํ•ฉ(๋‘ ๊ฐœ์˜ ๋ฐฐ์—ด์„ ์ˆœ์„œ์— ๋งž๊ฒŒ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด๋กœ ํ•ฉ์น˜๋Š” ๊ณผ์ •)์œผ๋กœ ๊ตฌํ˜„๋œ๋‹ค.
  • ์‹œ๊ฐ„ ๋ณต์žก๋„
    • ํ‰๊ท  : O(NlogN)
    • ์ตœ์„  : O(NlogN)
    • ์ตœ์•… : O(NlogN)

image

int sorted[MAX_SIZE] // ์ถ”๊ฐ€ ๊ณต๊ฐ„

// i: ์ •๋ ฌ๋œ ์™ผ์ชฝ ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค
// j: ์ •๋ ฌ๋œ ์˜ค๋ฅธ์ชฝ ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค
// k: ์ •๋ ฌ๋  ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค
/* 2๊ฐœ์˜ ์ธ์ ‘ํ•œ ๋ฐฐ์—ด arr[left...mid]์™€ arr[mid+1...right]์˜ ํ•ฉ๋ณ‘ ๊ณผ์ • */
/* (์‹ค์ œ๋กœ ์ˆซ์ž๋“ค์ด ์ •๋ ฌ๋˜๋Š” ๊ณผ์ •) */
void merge(int arr[], int left, int mid, int right) {
    int i, j, k, l;
    i = left;
    j = mid + 1;
    k = left;

    /* ๋ถ„ํ•  ์ •๋ ฌ๋œ arr์˜ ํ•ฉ๋ณ‘ */
    while(i <= mid && j <= right) {
        if(arr[i] <= arr[j])
            sorted[k++] = arr[i++];
        else
            sorted[k++] = arr[j++];
    }

    // ๋‚จ์•„ ์žˆ๋Š” ๊ฐ’๋“ค์„ ์ผ๊ด„ ๋ณต์‚ฌ
    if (i > mid) {
        for (l = j; l <= right; l++)
            sorted[k++] = arr[l];
    }
    // ๋‚จ์•„ ์žˆ๋Š” ๊ฐ’๋“ค์„ ์ผ๊ด„ ๋ณต์‚ฌ
    else {
        for (l = i; l <= mid; l++)
            sorted[k++] = arr[l];
    }

    // ๋ฐฐ์—ด sorted[](์ž„์‹œ ๋ฐฐ์—ด)์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐฐ์—ด arr[]๋กœ ์žฌ๋ณต์‚ฌ
    for (l = left; l <= right; l++){
        arr[l] = sorted[l];
    }
}

// ํ•ฉ๋ณ‘ ์ •๋ ฌ
void mergeSort(int arr[], int left, int right) {
    int mid;

    if (left < right) {
        mid = (left + right)/2; // ์ค‘๊ฐ„ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ท ๋“ฑ ๋ถ„ํ•  -๋ถ„ํ• (Divide)
        mergeSort(arr, left, mid); // ์•ž์ชฝ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ ์ •๋ ฌ -์ •๋ณต(Conquer)
        mergeSort(arr, mid+1, right); // ๋’ค์ชฝ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ ์ •๋ ฌ -์ •๋ณต(Conquer)

        merge(arr, left, mid, right); // ์ •๋ ฌ๋œ 2๊ฐœ์˜ ๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ํ•ฉ๋ณ‘ํ•˜๋Š” ๊ณผ์ • -๊ฒฐํ•ฉ(Combine)
    }
}

6. ํž™ ์ •๋ ฌ(Heap sort)

  • heap
    • ์ตœ์†Ÿ๊ฐ’ ํ˜น์€ ์ตœ๋Œ“๊ฐ’์ด root์— ์กด์žฌํ•˜๋Š” ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ
    • ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์ด ์ž์‹ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ
    • ์šฐ์„ ์ˆœ์œ„ ํ๋กœ ๊ตฌํ˜„
  • heap์˜ ํŠน์„ฑ์„ ๊ณ„์† ์œ ์ง€ํ•˜๋Š” ์ •๋ ฌ(์ „์ฒด ์ž๋ฃŒ๋ฅผ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค)
  • ์‚ฝ์ž…
    • ํž™์— ์ƒˆ๋กœ์šด ์š”์†Œ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด, ์ผ๋‹จ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ํž™์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์— ์‚ฝ์ž…ํ•œ๋‹ค.
    • ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ๋ถ€๋ชจ ๋…ธ๋“œ๋“ค๊ณผ ๊ตํ™˜ํ•ด์„œ ํž™์˜ ์„ฑ์งˆ์„ ๋งŒ์กฑ์‹œํ‚จ๋‹ค.

image1

  • ์‚ญ์ œ
    • ์ตœ๋Œ€ ํž™์—์„œ ์ตœ๋Œ“๊ฐ’์€ ๋ฃจํŠธ ๋…ธ๋“œ์ด๋ฏ€๋กœ ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ์‚ญ์ œ๋œ๋‹ค.
      • ์ตœ๋Œ€ ํž™(max heap)์—์„œ ์‚ญ์ œ ์—ฐ์‚ฐ์€ ์ตœ๋Œ“๊ฐ’์„ ๊ฐ€์ง„ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
    • ์‚ญ์ œ๋œ ๋ฃจํŠธ ๋…ธ๋“œ์—๋Š” ํž™์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
    • ํž™์„ ์žฌ๊ตฌ์„ฑํ•œ๋‹ค.

image2

  • ์‹œ๊ฐ„ ๋ณต์žก๋„
    • ํž™์€ ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ์ด๋ฏ€๋กœ ์ „์ฒด ๋†’์ด๊ฐ€ logN์œผ๋กœ, ํ•˜๋‚˜์˜ ์š”์†Œ๋ฅผ ํž™์— ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ๋•Œ ํž™์„ ์žฌ ์ •๋น„ํ•˜๋Š” ์‹œ๊ฐ„์ด logN๋งŒํผ ์†Œ์š”๋œ๋‹ค. ์ด N๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์— O(NlongN)์ด ์†Œ์š”๋œ๋‹ค.
    • ์ตœ์„  : O(NlogN)
    • ํ‰๊ท  : O(NlogN)
    • ์ตœ์•… : O(NlogN)

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

์ด๋ฆ„ ์ตœ์„  ํ‰๊ท  ์ตœ์•…
์‚ฝ์ž… N N^2 N^2
์„ ํƒ N^2 N^2 N^2
๋ฒ„๋ธ” N^2 N^2 N^2
ํ€ต NlogN NlogN N^2
ํ•ฉ๋ณ‘ NlogN NlogN NlogN