Algorithm

ํ€ต์ •๋ ฌ(Quick-Sort) ์•Œ๊ณ ๋ฆฌ์ฆ˜

DAHLIA CHOI 2024. 2. 2. 14:38

ํ€ต์ •๋ ฌ์ด๋ž€?

ํ€ต์ •๋ ฌ(Quick-Sort)์€ ํ‰๊ท  ์†๋„ (NlogN)์„ ์ž๋ž‘ํ•˜๋Š” ๋งค์šฐ ๋น ๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

๋ถ„ํ• ์ •๋ณต(Divide & Conquer) ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•˜๋‚˜๋กœ ๋‹ค๋ฅธ ์›์†Œ์™€ ๋น„๊ต๋งŒ์œผ๋กœ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋น„๊ต ์ •๋ ฌ์— ์†ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

์ •๋ ฌ๊ณผ์ •

ํ€ต์ •๋ ฌ์€ ์ž„์ด์˜ ํ”ผ๋ด‡(pivot)์„ ๊ธฐ์ค€์œผ๋กœ ์ขŒ์ธก์—๋Š” ํ”ผ๋ด‡๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ๋‘๊ณ  ์šฐ์ธก์—๋Š” ํ”ผ๋ด‡๋ณด๋‹ค ํฐ ๊ฐ’์„ ๋‘๋Š” ๋ฐฉ์‹์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.

 

  1. ํ”ผ๋ด‡์„ ์„ ํƒํ•œ๋‹ค.
  2. left๋Š” ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ€๋ฉด์„œ ํ”ผ๋ด‡๋ณด๋‹ค ๋” ํฐ ์ˆ˜๋ฅผ ์ฐพ๋Š”๋‹ค.
  3. right๋Š” ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ๊ฐ€๋ฉด์„œ ํ”ผ๋ด‡๋ณด๋‹ค ๋” ์ž‘์€ ์ˆ˜๋ฅผ ์ฐพ๋Š”๋‹ค.
  4. ์ฐพ์€ ์ง€์ ์—์„œ left์™€ right๋ฅผ ๊ตํ™˜ํ•œ๋‹ค.
  5. ์œ„ ๊ณผ์ •์„ left๋ž‘ right๊ฐ€ ๋ฐ”๋€” ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
  6. left๋ž‘ right๊ฐ€ ๋ฐ”๋€Œ๋ฉด ํ”ผ๋ด‡๊ณผ right๋ฅผ ๊ตํ™˜ํ•œ๋‹ค.
  7. ์œ„ ๊ณผ์ •์„ ๊ฑฐ์น˜๊ณ  ๋‚˜๋ฉด ํ”ผ๋ด‡์˜ ์™ผ์ชฝ์—๋Š” ํ”ผ๋ด‡๋ณด๋‹ค ์ž‘์€ ์ˆ˜๊ฐ€, ํ”ผ๋ด‡์˜ ์˜ค๋ฅธ์ชฝ์—๋Š” ํ”ผ๋ด‡๋ณด๋‹ค ํฐ ์ˆ˜๊ฐ€ ์œ„์น˜ํ•œ๋‹ค.
  8. ํ”ผ๋ด‡์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ๋ฆฌ์ŠคํŠธ ๋‘ ๊ฐœ๋กœ ๋‚˜๋ˆ  ๊ณผ์ •์„ ๋ฐ˜๋ณต ์ˆ˜ํ–‰ํ•œ๋‹ค.
  9. ํ•ด๋‹น ๊ณผ์ •์„ ์ˆœํ™˜ํ•˜๋ฉด ๋ถ„ํ• ๋œ ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ๊ฐ€ 0์ด๋‚˜ 1์ด ๋˜๋ฉด ์ˆ˜ํ–‰์„ ์ข…๋ฃŒํ•œ๋‹ค.

 

ํ€ต์ •๋ ฌ ์žฅ๋‹จ์ 

์žฅ์ 

  • ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค. ํŠน์ • ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ์ด์ƒ ํ‰๊ท  ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” nlogn์ด๋ฉฐ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋น„ํ•ด ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๋‹ค. (๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ merge sort์— ๋น„ํ•ด์„œ 2~3๋ฐฐ ๋น ๋ฅด๋‹ค)
  • ์ถ”๊ฐ€์ ์ธ ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ ํ”„๋ ˆ์ž„์— ์˜ํ•œ ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” logn์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒŒ ์†Œ๋น„ํ•œ๋‹ค.

๋‹จ์ 

  • ๋ถˆ์•ˆ์ • ์ •๋ ฌ์ด๋‹ค.
  • ์ตœ์•…์˜ ๊ฒฝ์šฐ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(n^2)์ด๋‹ค.
  • ํŠน์ • ์กฐ๊ฑดํ•˜์— ์„ฑ๋Šฅ์ด ๊ธ‰๊ฒฉํ•˜๊ฒŒ ๋–จ์–ด์ง„๋‹ค.
    • ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด์žˆ๋Š”๋ฐ ํ”ผ๋ด‡ ๊ฐ’์„ ๋ฐฐ์—ด์˜ ์ฒซ index๋กœ ์žก๋Š” ๊ฒฝ์šฐ..๋“ฑ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(n^2)์ด๋‹ค.

 

์†Œ์Šค์ฝ”๋“œ

import java.io.*;
import java.util.*;
public class Main {
   static int number = 10;  //๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜
   static int[] arr = {1, 10, 5, 8, 7, 6, 4, 3, 2, 9};  //์ •๋ ฌํ•  ๋ฐฐ์—ด

   public static void main(String[] args) throws IOException {
       quickSort(arr, 0, number - 1);
   }

   static void quickSort(int[] arr, int start, int end) {
       if (start >= end) {
           return;  //์›์†Œ๊ฐ€ 1๊ฐœ์ธ ๊ฒฝ์šฐ
       }

       int pivot = start;  //pivot๊ฐ’์€ ์ฒซ๋ฒˆ์งธ ์›์†Œ
       int i = start + 1;  //์‹œ์ž‘์  - ์™ผ์ชฝ๋ถ€ํ„ฐ ํฐ ๊ฐ’์„ ์ฐพ์„ ๋•Œ ์‹œ์ž‘ํ•˜๋Š” ์ธ๋ฑ์Šค
       int j = end;  //๋„์ฐฉ์  - ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ์ž‘์€ ๊ฐ’์„ ์ฐพ์„ ๋•Œ ์‹œ์ž‘ํ•˜๋Š” ์ธ๋ฑ์Šค
       int temp;  //์ˆ˜๋ฅผ ๋ฐ”๊ฟ€ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ž„์‹œ ๋ณ€์ˆ˜

       while (i <= j) { // ์—‡๊ฐˆ๋ฆด ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
           while (arr[i] <= arr[pivot]) { //pivot๋ณด๋‹ค ๋” ํฐ ๊ฐ’์„ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€
               i++;
           }
           while (arr[j] >= arr[pivot] && j > start) { //pivot๋ณด๋‹ค ๋” ์ž‘์€ ๊ฐ’์„ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€
               j--;
           }
           if (i > j) { //ํ˜„์žฌ ์—‡๊ฐˆ๋ฆฐ ์ƒํƒœ๋ฉด pivot๊ฐ’๊ณผ ๊ต์ฒด
               temp = arr[j];
               arr[j] = arr[pivot];
               arr[pivot] = temp;
           } else { //์—‡๊ฐˆ๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด i์™€ j๋ฅผ ๊ต์ฒด
               temp = arr[i];
               arr[i] = arr[j];
               arr[j] = temp;
           }
      }

       //๋ถ„ํ• ๋œ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ๋‘˜๋‹ค ํ€ต ์ •๋ ฌ ์ˆ˜ํ–‰
       quickSort(arr, start, j - 1);
       quickSort(arr, j + 1, end);
   }
}

๋งŒ์•ฝ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋ ค๋ฉด

 

import java.io.*;
import java.util.*;
public class Main {
    static int number = 10;  //๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜
    static int[] arr = {1, 10, 5, 8, 7, 6, 4, 3, 2, 9};  //์ •๋ ฌํ•  ๋ฐฐ์—ด

    public static void main(String[] args) throws IOException {
        quickSort(arr, 0, number - 1);
    }

    static void quickSort(int[] arr, int start, int end) {
        if (start >= end) {
            return;  //์›์†Œ๊ฐ€ 1๊ฐœ์ธ ๊ฒฝ์šฐ
        }

        int pivot = start;  //pivot๊ฐ’์€ ์ฒซ๋ฒˆ์งธ ์›์†Œ
        int i = start + 1;  //์‹œ์ž‘์  - ์™ผ์ชฝ๋ถ€ํ„ฐ ํฐ ๊ฐ’์„ ์ฐพ์„ ๋•Œ ์‹œ์ž‘ํ•˜๋Š” ์ธ๋ฑ์Šค
        int j = end;  //๋„์ฐฉ์  - ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ์ž‘์€ ๊ฐ’์„ ์ฐพ์„ ๋•Œ ์‹œ์ž‘ํ•˜๋Š” ์ธ๋ฑ์Šค
        int temp;  //์ˆ˜๋ฅผ ๋ฐ”๊ฟ€ ๋•Œ ์ž„์‹œ ๋ณ€์ˆ˜

        while (i <= j) { // ์—‡๊ฐˆ๋ฆด ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
            while (arr[i] >= arr[pivot]) { //pivot๋ณด๋‹ค ๋” ํฐ ๊ฐ’์„ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€
                i++;
            }
            while (arr[j] <= arr[pivot] && j > start) { //pivot๋ณด๋‹ค ๋” ์ž‘์€ ๊ฐ’์„ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€
                j--;
            }
            if (i > j) { //ํ˜„์žฌ ์—‡๊ฐˆ๋ฆฐ ์ƒํƒœ๋ฉด pivot๊ฐ’๊ณผ ๊ต์ฒด
                temp = arr[j];
                arr[j] = arr[pivot];
                arr[pivot] = temp;
            } else { //์—‡๊ฐˆ๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด i์™€ j๋ฅผ ๊ต์ฒด
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
       }

        //๋ถ„ํ• ๋œ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ๋‘˜๋‹ค ํ€ต ์ •๋ ฌ ์ˆ˜ํ–‰
        quickSort(arr, start, j - 1);
        quickSort(arr, j + 1, end);
    }
}

์ค‘๊ฐ„๋ถ€๋ถ„ ํ”ผ๋ด‡๊ณผ ๋น„๊ตํ•˜๋Š” ์ฝ”๋“œ๋งŒ ๋ฐ”๊พธ๋ฉด ๋œ๋‹ค.



reference

https://propercoding.tistory.com/195