๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with Python]_23_ํ€ต์ •๋ ฌ ๋ณธ๋ฌธ

๐Ÿฆฅ ์ฝ”ํ…Œ/์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with python

[์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with Python]_23_ํ€ต์ •๋ ฌ

์ง•์ง•์•ŒํŒŒ์นด 2022. 2. 8. 01:07
728x90
๋ฐ˜์‘ํ˜•

220208 ์ž‘์„ฑ

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” ใ€Ž์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹คใ€ ์˜ youtube๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค>

https://www.youtube.com/watch?v=EuJSDghD4z8&list=PLVsNizTWUw7H9_of5YCB0FmsSc-K44y81&index=23 

 

 

 

 

 

1. ํ€ต ์ •๋ ฌ

: ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•˜๊ณ , ๊ทธ ๊ธฐ์ค€๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ์™€ ์ž‘์€ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊พธ๊ธฐ

: ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ (PIVOT) ์œผ๋กœ ์„ค์ •

: ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

1) ์ฒซ ๋ฒˆ์งธ ์ˆ˜๊ฐ€ ํ”ผ๋ฒ—์ด๋‹ค

2) ์™ผ์ชฝ์—์„œ 5๋ณด๋‹ค ํฐ ์ˆ˜๋ฅผ ๊ณ ๋ฅธ๋‹ค

3) ์˜ค๋ฅธ์ชฝ์—์„œ 5๋ณด๋‹ค ์ž‘์€ ์ˆ˜๋ฅผ ๊ณ ๋ฅธ๋‹ค

4) ๋‘˜์ด ๊ตํ™˜ํ•œ๋‹ค

5) ๊ทธ๋‹ค์Œ ์นธ ์™ผ์ชฝ์—์„œ ๋” ํฐ ์ˆ˜ ๊ณ ๋ฅธ๋‹ค

6) ๊ทธ๋‹ค์Œ ์นธ ์˜ค๋ฅธ์ชฝ์—์„œ ๋” ์ž‘์€ ์ˆ˜ ๊ณ ๋ฅธ๋‹ค

....

์œ„์น˜๊ฐ€ ์—‡๊ฐˆ๋ฆฌ๋Š” ๊ฒฝ์šฐ!!! ํ”ผ๋ฒ— (5) ์™€ ์ž‘์€ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝ

๊ทธ๋Ÿฌ๋ฉด ํ”ผ๋ฒ— (5) ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ์€ 5๋ณด๋‹ค ์ž‘์€ ๊ฒƒ, ์˜ค๋ฅธ์ชฝ์€ 5๋ณด๋‹ค ํฐ ๊ฒƒ์œผ๋กœ ๋‚˜๋‰จ

ํ”ผ๋ฒ—์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ฌถ์Œ์„ ๋‚˜๋ˆ„๋Š ์ž‘์—…์„ ๋ถ„ํ• ์ด๋ผ๊ณ  ํ•จ

7) ์™ผ์ชฝ ๋ฐ์ดํ„ฐ ๋ฌถ์Œ ์ •๋ ฌ๋กœ ์ˆ˜ํ–‰

8) ์˜ค๋ฅธ์ชฝ ๋ฐ์ดํ„ฐ ๋ฌถ์Œ ์ •๋ ฌ๋กœ ์ˆ˜ํ–‰

.....

์ด๋Ÿฐ ๊ณผ์ • ๋ฐ˜๋ณต

 

 

 

  • python
array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]

def quick_sort(array, start, end) :
    if start >= end :   # ์›์†Œ๊ฐ€ 1๊ฐœ์ด๋ฉด ์ข…๋ฃŒ
        return
    pivot = start     # ํ”ผ๋ฒ—์€ ์ฒซ ๋ฒˆ์งธ ์ˆซ์ž
    left = start + 1
    right = end

    while (left <= right) : # ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ ์ฐพ์„ ๋•Œ๊นŒ์ง€
        # ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ ์ฐพ์„ ๋•Œ๊นŒ์ง€
        while (left <= end and array[left] <= array[pivot]) :
            left += 1
        while (right > start and array[right] >= array[pivot]) :
            right -= 1
        
        if (left > right) :   # ์—‡๊ฐˆ๋ฆผ
            array[right], array[pivot] = array[pivot], array[right]
        else :
            array[left], array[right] = array[right], array[left]

    # ๋ถ„ํ•  ์ดํ›„.. ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ๋ฌถ์Œ ์ •๋ ฌ ใ„ฑ ใ„ฑ
    quick_sort(array, start, right - 1)   # ์˜ค๋ฅธ์ชฝ
    quick_sort(array, right + 1, end)     # ์™ผ์ชฝ

quick_sort(array, 0, len(array)-1)
print(array)

  • ๋” ์‰ฌ์šด python !!!!!
array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]

def quick_sort(array) :
    if len(array) <= 1 : # ์›์†Œ ํ•œ๊ฐœ ์ดํ•˜..
        return array

    pivot = array[0]  # ํ”ผ๋ฒ— ์ฒซ ๋ฒˆ์งธ
    tail = array[1:]  # ํ”ผ๋ฒ— ์ œ์™ธ

    left_side = [x for x in tail if x <= pivot] # ๋ถ„ํ•  ์™ผ์ชฝ
    right_side = [x for x in tail if x > pivot] # ๋ถ„ํ•  ์˜ค๋ฅธ์ชฝ

    # ๋ถ„ํ•  ์ดํ›„, ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ๋ฌถ์Œ ์ •๋ ฌํ•ด์„œ ์ „์ฒด๋ฆฌ์ŠคํŠธ ๋ฐ˜ํ™˜
    return quick_sort(left_side) + [pivot] + quick_sort(right_side)

print(quick_sort(array))
  • c++
#include <bits/stdc++.h>

using namespace std;

int n = 10;
int arr[10] = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8};

void quickSort(int* arr, int start, int end) {
    if (start >= end) return; // ์›์†Œ๊ฐ€ 1๊ฐœ์ธ ๊ฒฝ์šฐ ์ข…๋ฃŒ
    int pivot = start; // ํ”ผ๋ฒ—์€ ์ฒซ ๋ฒˆ์งธ ์›์†Œ
    int left = start + 1;
    int right = end;
    while (left <= right) {
        // ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
        while (left <= end && arr[left] <= arr[pivot]) left++;
        // ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
        while (right > start && arr[right] >= arr[pivot]) right--;
        // ์—‡๊ฐˆ๋ ธ๋‹ค๋ฉด ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํ”ผ๋ฒ—์„ ๊ต์ฒด
        if (left > right) swap(arr[pivot], arr[right]);
        // ์—‡๊ฐˆ๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ต์ฒด
        else swap(arr[left], arr[right]);
    }
    // ๋ถ„ํ•  ์ดํ›„ ์™ผ์ชฝ ๋ถ€๋ถ„๊ณผ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์—์„œ ๊ฐ๊ฐ ์ •๋ ฌ ์ˆ˜ํ–‰
    quickSort(arr, start, right - 1);
    quickSort(arr, right + 1, end);
}

int main(void) {
    quickSort(arr, 0, n - 1);
    for (int i = 0; i < n; i++) {
        cout << arr[i] << ' ';
    }
}
  • java
import java.util.*;

public class Main {

    public static void quickSort(int[] arr, int start, int end) {
        if (start >= end) return; // ์›์†Œ๊ฐ€ 1๊ฐœ์ธ ๊ฒฝ์šฐ ์ข…๋ฃŒ
        int pivot = start; // ํ”ผ๋ฒ—์€ ์ฒซ ๋ฒˆ์งธ ์›์†Œ
        int left = start + 1;
        int right = end;
        while (left <= right) {
            // ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
            while (left <= end && arr[left] <= arr[pivot]) left++;
            // ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
            while (right > start && arr[right] >= arr[pivot]) right--;
            // ์—‡๊ฐˆ๋ ธ๋‹ค๋ฉด ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํ”ผ๋ฒ—์„ ๊ต์ฒด
            if (left > right) {
                int temp = arr[pivot];
                arr[pivot] = arr[right];
                arr[right] = temp;
            }
            // ์—‡๊ฐˆ๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ต์ฒด
            else {
                int temp = arr[left];
                arr[left] = arr[right];
                arr[right] = temp;
            }
        }
        // ๋ถ„ํ•  ์ดํ›„ ์™ผ์ชฝ ๋ถ€๋ถ„๊ณผ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์—์„œ ๊ฐ๊ฐ ์ •๋ ฌ ์ˆ˜ํ–‰
        quickSort(arr, start, right - 1);
        quickSort(arr, right + 1, end);
    }

    public static void main(String[] args) {
        int n = 10;
        int[] arr = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8};

        quickSort(arr, 0, n - 1);

        for(int i = 0; i < n; i++) {
            System.out.print(arr[i] + " ");
        }
    }

}

 

 

 

 

 

 

2. ํ€ต ์ •๋ ฌ ๋น ๋ฅธ ์ด์œ 

: ์ด์ƒ์ ์ธ ๊ฒฝ์šฐ ๋ถ„ํ• ์ด ์ ˆ๋ฐ˜์”ฉ ์ผ์–ด๋‚œ๋‹ค๋ฉด, ์ „์ฒด ์—ฐ์‚ฐ ํšŸ์ˆ˜๋กœ O(NlogN)

: ๋„ˆ๋น„ X ๋†’์ด = N X logN = NlogN

 

 

 

 

3. ํ€ต ์ •๋ ฌ ์‹œ๊ฐ„ ๋ณต์žก๋„

: ํ‰๊ท  O(NlogN)

: ์ตœ์•…์€ O(N^2)         ์ด๋ฏธ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์— ๋Œ€ํ•ด ํ€ต ์ •๋ ฌ์„ ํ•˜๋ฉด... ๋งค๋ฒˆ ๋ถ„ํ•  ์ด๋ค„์ง..

=> O(NlogN)

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•
Comments