ํต ์ ๋ ฌ (Quick Sort)
ํต์ฌ ์์
ํต์ฌ ์์ | ์ค๋ช
|
ํผ๋ฒ(Pivot) | ๋ฐฐ์ด์ ๋ถํ ํ๋ ๊ธฐ์ค์ด ๋๋ ์์๋ก, ์ผ๋ฐ์ ์ผ๋ก ๋ฐฐ์ด์ ๋ง์ง๋ง ์์๋ฅผ ์ ํ |
๋ถํ (Partition) | ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ๋ฐฐ์ด์ ์์ ๊ฐ๊ณผ ํฐ ๊ฐ์ผ๋ก ๋๋๋ ๊ณผ์ |
์ฌ๊ท(Recursion) | ๋ถํ ๋ ๋ถ๋ถ ๋ฐฐ์ด์ ๋ํด ๋์ผํ ์ ๋ ฌ ๊ณผ์ ์ ๋ฐ๋ณต์ ์ผ๋ก ์ํํ๋ ๋ฐฉ์ |
์๊ฐ ๋ณต์ก๋
์ต์ ์ ๊ฒฝ์ฐ | O(n log n) |
ํ๊ท ์ ๊ฒฝ์ฐ | O(n log n) |
์ต์
์ ๊ฒฝ์ฐ | O(nยฒ) |
์ฃผ์ ํน์ง
โข
๋ถ์์ ์ ๋ ฌ: ๋์ผํ ๊ฐ์ ์์๋ค์ ์๋์ ์์น๊ฐ ๋ณ๊ฒฝ๋ ์ ์์
โข
์ ์๋ฆฌ ์ ๋ ฌ: ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๊ฑฐ์ ํ์ํ์ง ์์
โข
๋ค๋ฅธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋นํด ์ผ๋ฐ์ ์ผ๋ก ๋น ๋ฅธ ์ฑ๋ฅ์ ๋ณด์
์์ ์ฝ๋ (Java)
/**
* ํต ์ ๋ ฌ(Quick Sort)์ ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ํ๋๋ก, ํ๊ท ์ ์ผ๋ก O(n log n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ ํจ์จ์ ์ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์
๋๋ค.
*
* ์๊ณ ๋ฆฌ์ฆ ์์๋:
* 1. ํผ๋ฒ(Pivot)์ ์ ํํฉ๋๋ค. (์ผ๋ฐ์ ์ผ๋ก ๋ฐฐ์ด์ ๋ง์ง๋ง ์์๋ฅผ ์ ํ)
* 2. ๋ฐฐ์ด์ ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ๋ ๋ถ๋ถ์ผ๋ก ๋๋๋๋ค. (ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ๊ณผ ํฐ ๊ฐ์ผ๋ก ๋ถํ )
* 3. ๋ถํ ๋ ๋ ๋ถ๋ถ ๋ฐฐ์ด์ ๋ํด ์ฌ๊ท์ ์ผ๋ก ํต ์ ๋ ฌ์ ์ํํฉ๋๋ค.
* 4. ๋ชจ๋ ๋ถ๋ถ ๋ฐฐ์ด์ด ์ ๋ ฌ๋๋ฉด ์ ์ฒด ๋ฐฐ์ด์ด ์ ๋ ฌ๋ฉ๋๋ค.
*
* ํน์ง:
* - ํ๊ท ์๊ฐ ๋ณต์ก๋: O(n log n)
* - ์ต์
์๊ฐ ๋ณต์ก๋: O(n^2) (์ด๋ฏธ ์ ๋ ฌ๋ ๋ฐฐ์ด์์ ํผ๋ฒ ์ ํ์ด ๋นํจ์จ์ ์ผ ๊ฒฝ์ฐ)
* - ๊ณต๊ฐ ๋ณต์ก๋: O(log n) (์ฌ๊ท ํธ์ถ ์คํ ์ฌ์ฉ)
* - ์ ์๋ฆฌ ์ ๋ ฌ(In-place Sort)๋ก ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ์ ์
*/
public class QuickSort {
/**
* ๋ฐฐ์ด์ ํต ์ ๋ ฌํ๋ ๋ฉ์๋.
*
* @param arr ์ ๋ ฌํ ๋ฐฐ์ด
* @param low ์ ๋ ฌํ ๋ถ๋ถ ๋ฐฐ์ด์ ์์ ์ธ๋ฑ์ค
* @param high ์ ๋ ฌํ ๋ถ๋ถ ๋ฐฐ์ด์ ๋ ์ธ๋ฑ์ค
*/
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
int pivotIndex = partition(arr, low, high);
quickSort(arr, low, pivotIndex - 1); // ์ผ์ชฝ ๋ถ๋ถ ์ ๋ ฌ
quickSort(arr, pivotIndex + 1, high); // ์ค๋ฅธ์ชฝ ๋ถ๋ถ ์ ๋ ฌ
}
}
/**
* ๋ฐฐ์ด์ ๋ถํ ํ๊ณ ํผ๋ฒ์ ์ต์ข
์์น๋ฅผ ๋ฐํํ๋ ๋ฉ์๋.
*
* @param arr ๋ถํ ํ ๋ฐฐ์ด
* @param low ๋ถํ ํ ๋ถ๋ถ ๋ฐฐ์ด์ ์์ ์ธ๋ฑ์ค
* @param high ๋ถํ ํ ๋ถ๋ถ ๋ฐฐ์ด์ ๋ ์ธ๋ฑ์ค
* @return ํผ๋ฒ์ ์ต์ข
์์น ์ธ๋ฑ์ค
*/
private static int partition(int[] arr, int low, int high) {
int pivot = arr[high]; // ํผ๋ฒ์ ๋ฐฐ์ด์ ๋ง์ง๋ง ์์๋ก ์ค์
int i = low - 1; // ์์ ์์์ ์ธ๋ฑ์ค
for (int j = low; j < high; j++) {
if (arr[j] <= pivot) {
i++;
// ์์ ๊ตํ
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
// ํผ๋ฒ์ ์ฌ๋ฐ๋ฅธ ์์น๋ก ์ด๋
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
return i + 1; // ํผ๋ฒ์ ์ธ๋ฑ์ค ๋ฐํ
}
/**
* ๋ฉ์ธ ๋ฉ์๋. ๋ฐฐ์ด์ ์ ๋ ฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ.
*
* @param args ์คํ ์ ์ ๋ฌ๋๋ ๋ช
๋ นํ ์ธ์
*/
public static void main(String[] args) {
int[] data = {10, 7, 8, 9, 1, 5};
System.out.println("Unsorted array:");
for (int num : data) {
System.out.print(num + " ");
}
quickSort(data, 0, data.length - 1);
System.out.println("\nSorted array:");
for (int num : data) {
System.out.print(num + " ");
}
}
}
Java
๋ณต์ฌ
Java Collections๋ก ๊ตฌํ
import java.util.ArrayList;
import java.util.Collections;
public class QuickSortCollection {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(64);
list.add(34);
list.add(25);
list.add(12);
list.add(22);
System.out.println("์ ๋ ฌ ์ : " + list);
Collections.sort(list); // ํต ์ ๋ ฌ ๊ธฐ๋ฐ์ ์ ๋ ฌ ์ํ
System.out.println("์ ๋ ฌ ํ: " + list);
}
}
Java
๋ณต์ฌ
ํต ์ ๋ ฌ vs ๋ณํฉ ์ ๋ ฌ
๋น๊ต ๊ธฐ์ค | ํต ์ ๋ ฌ | ๋ณํฉ ์ ๋ ฌ |
์๊ฐ ๋ณต์ก๋ (ํ๊ท ) | O(n log n) | O(n log n) |
์๊ฐ ๋ณต์ก๋ (์ต์
) | O(nยฒ) | O(n log n) |
๊ณต๊ฐ ๋ณต์ก๋ | O(log n) | O(n) |
์์ ์ฑ | ๋ถ์์ ์ ๋ ฌ | ์์ ์ ๋ ฌ |
์ ์๋ฆฌ ์ ๋ ฌ | ์ | ์๋์ค |
ํต ์ ๋ ฌ & ๋ณํฉ ์ ๋ ฌ ๊ณตํต์
โข
๋ถํ ์ ๋ณต(Divide and Conquer) ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ
โข
ํ๊ท ์๊ฐ ๋ณต์ก๋๊ฐ O(n log n)์ผ๋ก ๋์ผ
โข
์ฌ๊ท์ ๋ฐฉ์์ผ๋ก ๊ตฌํ ๊ฐ๋ฅ
โข
๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ํจ์จ์
โข
๋น๊ต ๊ธฐ๋ฐ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
์ฃผ์ ์ฐจ์ด์ ์ค๋ช
๋น๊ต ํญ๋ชฉ | ํต ์ ๋ ฌ | ๋ณํฉ ์ ๋ ฌ |
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ | ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ฑฐ์ ๋ถํ์ | ๋ฐฐ์ด ํฌ๊ธฐ๋งํผ์ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ํ์ |
์์ ์ฑ | ๋ถ์์ ์ ๋ ฌ (์์ ์ ์ง ์๋จ) | ์์ ์ ๋ ฌ (์์ ์ ์ง๋จ) |
์ค์ ์ฑ๋ฅ | ์ผ๋ฐ์ ์ผ๋ก ๋ ๋น ๋ฆ | ์ผ๊ด๋ ์ฑ๋ฅ |
์ ์ฉ ์ํฉ | ๋ฉ๋ชจ๋ฆฌ ์ ํ์ ์ด๊ณ ํ๊ท ์ฑ๋ฅ ์ค์ | ์์ ์ ์ ๋ ฌ๊ณผ ์ผ๊ด๋ ์ฑ๋ฅ ํ์ |
ํต์ ๋ ฌ๊ณผ ๋ณํฉ์ ๋ ฌ์ ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด๋ย ๋ถํ ๊ณผ ๋ณํฉ์ ๋ฐฉ์๊ณผย ๊ณต๊ฐ ๋ณต์ก๋์ ์์ต๋๋ค.
1.
๋ถํ ๋ฐฉ์:
โข
ํต ์ ๋ ฌ: ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ๋ฐฐ์ด์ย ๋ถํ ํ ๋ค, ๊ฐ ๋ถ๋ถ ๋ฐฐ์ด์ ์ฌ๊ท์ ์ผ๋ก ์ ๋ ฌํฉ๋๋ค. ๋ณํฉ ๊ณผ์ ์ด ํ์ํ์ง ์์ต๋๋ค.
โข
๋ณํฉ ์ ๋ ฌ: ๋ฐฐ์ด์ย ๊ท ๋ฑํ๊ฒ ๋ถํ ํ ๋ค, ๋ณํฉ ๋จ๊ณ์์ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ํฉ์นฉ๋๋ค.
2.
๋ณํฉ ๊ณผ์ :
โข
ํต ์ ๋ ฌ: ๋ณํฉ ๊ณผ์ ์ด ์์ผ๋ฉฐ, ๋ถํ ๋จ๊ณ์์ ์ ๋ ฌ์ด ์ด๋ฃจ์ด์ง๋๋ค.
โข
๋ณํฉ ์ ๋ ฌ: ๋ณํฉ ๋จ๊ณ์์ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ํฉ์น๋ฉฐ ์ ๋ ฌ์ด ์ด๋ฃจ์ด์ง๋๋ค.
3.
๊ณต๊ฐ ๋ณต์ก๋:
โข
ํต ์ ๋ ฌ: ์ ์๋ฆฌ ์ ๋ ฌ(In-place Sort)๋ก ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ์ ์ผ๋ฉฐ, ๊ณต๊ฐ ๋ณต์ก๋๋ O(log n)์
๋๋ค.
โข
๋ณํฉ ์ ๋ ฌ: ์ถ๊ฐ ๋ฐฐ์ด์ด ํ์ํ๋ฉฐ, ๊ณต๊ฐ ๋ณต์ก๋๋ O(n)์
๋๋ค.
4.
์ต์
์๊ฐ ๋ณต์ก๋:
โข
ํต ์ ๋ ฌ: ํผ๋ฒ ์ ํ์ด ๋นํจ์จ์ ์ผ ๊ฒฝ์ฐ O(nยฒ)์
๋๋ค.
โข
๋ณํฉ ์ ๋ ฌ: ํญ์ O(n log n)์
๋๋ค.
ํต ์ ๋ ฌ ์์๋
graph TD; A["๋ฐฐ์ด์ ๋ถํ "] --> B["ํผ๋ฒ ๊ธฐ์ค์ผ๋ก ์์ ๊ฐ ๋ฐฐ์ด๋ก ๋๋๋ค"]; A --> C["ํผ๋ฒ ๊ธฐ์ค์ผ๋ก ํฐ ๊ฐ ๋ฐฐ์ด๋ก ๋๋๋ค"]; B --> D["ํฌ๊ธฐ 1์ด ๋ ๋ ๊น์ง ์ฌ๊ท์ ์ผ๋ก ๋๋๋ค"]; B --> E["ํฌ๊ธฐ 1์ด ๋ ๋ ๊น์ง ์ฌ๊ท์ ์ผ๋ก ๋๋๋ค"]; C --> F["ํฌ๊ธฐ 1์ด ๋ ๋ ๊น์ง ์ฌ๊ท์ ์ผ๋ก ๋๋๋ค"]; C --> G["ํฌ๊ธฐ 1์ด ๋ ๋ ๊น์ง ์ฌ๊ท์ ์ผ๋ก ๋๋๋ค"]; D --> H["์์ ๊ฐ ๋ฐฐ์ด์ ๋ณํฉ ํ์ฌ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ๋ง๋ ๋ค"]; E --> I["์์ ๊ฐ ๋ฐฐ์ด์ ๋ณํฉ ํ์ฌ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ๋ง๋ ๋ค"]; F --> J["ํฐ ๊ฐ ๋ฐฐ์ด์ ๋ณํฉ ํ์ฌ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ๋ง๋ ๋ค"]; G --> K["์์ ๊ฐ ๋ฐฐ์ด์ ๋ณํฉ ํ์ฌ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ๋ง๋ ๋ค"]; H --> L["์ ๋ ฌ๋ ๋ฐฐ์ด ์์ฑ"]; I --> L; J --> L; K --> L;
Mermaid
๋ณต์ฌ
์ฌ๊ทํธ์ถ ์คํ ์์
mergeSort(arr, 0, 7)
โโ mergeSort(arr, 0, 3)
โ โโ mergeSort(arr, 0, 1)
โ โ โโ mergeSort(arr, 0, 0) โ (๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ, ๋ฆฌํด)
โ โ โโ mergeSort(arr, 1, 1) โ (๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ, ๋ฆฌํด)
โ โ โโ merge(arr, 0, 0, 1) โ ๋ ๊ฐ์ ์ ๋ ฌ๋ ๋ฐฐ์ด ๋ณํฉ
โ โ
โ โโ mergeSort(arr, 2, 3)
โ โ โโ mergeSort(arr, 2, 2) โ (๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ, ๋ฆฌํด)
โ โ โโ mergeSort(arr, 3, 3) โ (๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ, ๋ฆฌํด)
โ โ โโ merge(arr, 2, 2, 3) โ ๋ ๊ฐ์ ์ ๋ ฌ๋ ๋ฐฐ์ด ๋ณํฉ
โ โ
โ โโ merge(arr, 0, 1, 3) โ ๋ ๊ฐ์ ์ ๋ ฌ๋ ๋ฐฐ์ด ๋ณํฉ
โ
โโ mergeSort(arr, 4, 7)
โ โโ mergeSort(arr, 4, 5)
โ โ โโ mergeSort(arr, 4, 4) โ (๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ, ๋ฆฌํด)
โ โ โโ mergeSort(arr, 5, 5) โ (๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ, ๋ฆฌํด)
โ โ โโ merge(arr, 4, 4, 5) โ ๋ ๊ฐ์ ์ ๋ ฌ๋ ๋ฐฐ์ด ๋ณํฉ
โ โ
โ โโ mergeSort(arr, 6, 7)
โ โ โโ mergeSort(arr, 6, 6) โ (๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ, ๋ฆฌํด)
โ โ โโ mergeSort(arr, 7, 7) โ (๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ, ๋ฆฌํด)
โ โ โโ merge(arr, 6, 6, 7) โ ๋ ๊ฐ์ ์ ๋ ฌ๋ ๋ฐฐ์ด ๋ณํฉ
โ โ
โ โโ merge(arr, 4, 5, 7) โ ๋ ๊ฐ์ ์ ๋ ฌ๋ ๋ฐฐ์ด ๋ณํฉ
โ
โโ merge(arr, 0, 3, 7) โ ์ต์ข
์ ์ผ๋ก ๋ชจ๋ ๋ถ๋ถ์ ๋ณํฉ
Java
๋ณต์ฌ
์คํ ์์๋๋ก ๋ถํ ๋ฐ ๋ณํฉ ๊ณผ์ (Merge Sort ๊ณผ์ ์๋ฎฌ๋ ์ด์ )
๋ณํฉ ์ ๋ ฌ์ "๋ถํ (Divide)" ํ "๋ณํฉ (Merge)" ๊ณผ์ ์ด ์งํ๋ฉ๋๋ค.
์๋ ํ์์๋ ๋ถํ ๊ณผ ๋ณํฉ์ ๋์์ ์คํ ์์๋๋ก ์ ๋ฆฌํ์ต๋๋ค.
1. ์ด๊ธฐ ๋ฐฐ์ด
{45, 12, 89, 33, 76, 27, 8, 19}
Plain Text
๋ณต์ฌ
2. ๋ถํ & ๋ณํฉ ๊ณผ์
๋จ๊ณ | ๋ถํ (Divide) | ๋ณํฉ (Merge) |
โ | {45, 12, 89, 33} {76, 27, 8, 19} | |
โก | {45, 12} {89, 33} {76, 27} {8, 19} | |
โข | {45} {12} {89} {33} {76} {27} {8} {19} | |
โฃ | {12, 45} {33, 89} {27, 76} {8, 19} | |
โค | {12, 33, 45, 89} {8, 19, 27, 76} | |
โฅ | {8, 12, 19, 27, 33, 45, 76, 89} | |
(์ต์ข
์ ๋ ฌ ์๋ฃ) |
3. ๊ณผ์ ์์ธ ์๊ฐํ
์ด๊ธฐ ์ํ: {45, 12, 89, 33, 76, 27, 8, 19}
1. ๋ถํ : {45, 12, 89, 33} | {76, 27, 8, 19}
2. ๋ถํ : {45, 12} | {89, 33} | {76, 27} | {8, 19}
3. ๋ถํ : {45} {12} | {89} {33} | {76} {27} | {8} {19}
----------------------------------------------------
4. ๋ณํฉ: {12, 45} | {33, 89} | {27, 76} | {8, 19}
5. ๋ณํฉ: {12, 33, 45, 89} | {8, 19, 27, 76}
6. ๋ณํฉ: {8, 12, 19, 27, 33, 45, 76, 89} (์ต์ข
์ ๋ ฌ ์๋ฃ)
Plain Text
๋ณต์ฌ
4. ์ต์ข ๊ฒฐ๊ณผ
{8, 12, 19, 27, 33, 45, 76, 89}
Plain Text
๋ณต์ฌ
์ด์ฒ๋ผ ๋ณํฉ ์ ๋ ฌ์ ๋ถํ (Divide) โ ์ ๋ ฌ ๋ฐ ๋ณํฉ(Merge) ๋จ๊ณ๋ฅผ ๋ฐ๋ณตํ๋ฉฐ ์ ๋ ฌ์ด ์ด๋ฃจ์ด์ง๋๋ค.