๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[์ด๊ฒ์ด ์ฝ๋ฉ ํ ์คํธ๋ค with Python]_23_ํต์ ๋ ฌ ๋ณธ๋ฌธ
[์ด๊ฒ์ด ์ฝ๋ฉ ํ ์คํธ๋ค with Python]_23_ํต์ ๋ ฌ
์ง์ง์ํ์นด 2022. 2. 8. 01:07220208 ์์ฑ
<๋ณธ ๋ธ๋ก๊ทธ๋ ใ์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉ ํ ์คํธ๋คใ ์ 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)