quickSort
Quick Sort
ํต ์ ๋ ฌ (Quick Sort)
: ํน์ ํ ๊ฐ์ ๊ธฐ์ค(ํผ๋ฒ)์ผ๋ก ํฐ ์ซ์์ ์์ ์ซ์๋ฅผ ์๋ฃ ๊ตํํ ๋ค์ ๋ฐฐ์ด์ ๋ฐ์ผ๋ก ๋๋๋ค
๋ํ์ ์ธ ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ๊ท ์๋๊ฐ O(N*logN)์ด๋ค
ํ์ง๋ง ํต ์ ๋ ฌ ์ต์ ์๊ฐ ๋ณต์ก๋๋ O(N^2)์ด๋ค
์ ๋ ฌ ๋ฐฉ๋ฒ
ํต ์ ๋ ฌ์ ๋ถํ ์ ๋ณต(divide and conquer) ๋ฐฉ๋ฒ์ ํตํด ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ๋ค. 1. ๋ฆฌ์คํธ ๊ฐ์ด๋ฐ์ ํ๋์ ์์๋ฅผ ๊ณ ๋ฅธ๋ค. ์ด๋ ๊ฒ ๊ณ ๋ฅธ ์์๋ฅผ ํผ๋ฒ์ด๋ผ๊ณ ํ๋ค. 2. ํผ๋ฒ ์์๋ ํผ๋ฒ๋ณด๋ค ๊ฐ์ด ์์ ๋ชจ๋ ์์๋ค์ด ์ค๊ณ , ํผ๋ฒ ๋ค์๋ ํผ๋ฒ๋ณด๋ค ๊ฐ์ด ํฐ ๋ชจ๋ ์์๋ค์ด ์ค๋๋ก ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ๋ฆฌ์คํธ๋ฅผ ๋๋ก ๋๋๋ค. ์ด๋ ๊ฒ ๋ฆฌ์คํธ๋ฅผ ๋๋ก ๋๋๋ ๊ฒ์ ๋ถํ ์ด๋ผ๊ณ ํ๋ค. ๋ถํ ์ ๋ง์น ๋ค์ ํผ๋ฒ์ ๋ ์ด์ ์์ง์ด์ง ์๋๋ค. 3. ๋ถํ ๋ ๋ ๊ฐ์ ์์ ๋ฆฌ์คํธ์ ๋ํด ์ฌ๊ท(Recursion)์ ์ผ๋ก ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค. ์ฌ๊ท๋ ๋ฆฌ์คํธ์ ํฌ๊ธฐ๊ฐ 0์ด๋ 1์ด ๋ ๋๊น์ง ๋ฐ๋ณต๋๋ค. ์ฌ๊ท ํธ์ถ์ด ํ๋ฒ ์งํ๋ ๋๋ง๋ค ์ต์ํ ํ๋์ ์์๋ ์ต์ข ์ ์ผ๋ก ์์น๊ฐ ์ ํด์ง๋ฏ๋ก, ์ด ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋์ ๋๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ ์ ์๋ค.

public class QuickSort {
// a[idx1]์ a[idx2]์ ๊ฐ์ ๋ฐ๊ฟ๋๋ค.
static void swap(int[] a, int idx1, int idx2) {
int t = a[idx1];
a[idx1] = a[idx2];
a[idx2] = t;
}
// ํต ์ ๋ ฌ
static void quickSort(int[] a, int left, int right) {
int pl = left; // ์ผ์ชฝ ์ปค์
int pr = right; // ์ค๋ฅธ์ชฝ ์ปค์
int x = a[(pl + pr) / 2]; // ํผ๋ฒ
do {
while (a[pl] < x)
pl++;
while (a[pr] > x)
pr--;
if (pl <= pr)
swap(a, pl++, pr--);
} while (pl <= pr);
if (left < pr)
quickSort(a, left, pr);
if (pl < right)
quickSort(a, pl, right);
}
public static void main(String[] args) {
int[] x = { 1, 10, 5, 8, 7, 6, 4, 3, 2, 9 };
quickSort(x, 0, x.length - 1); // ๋ฐฐ์ด x๋ฅผ ํต ์ ๋ ฌ
for (int i = 0; i < x.length; i++)
System.out.println("x[" + i + "]๏ผ" + x[i]);
}
}
array = [1, 10, 5, 8, 7, 6, 4, 3, 2, 9]
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)
ํ์ด์ฌ ๋ฌธ๋ฒ ์์ฉ์ผ๋ก ๊ตฌํํ ํต์ ๋ ฌ
array = [1, 10, 5, 8, 7, 6, 4, 3, 2, 9]
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))
Last updated
Was this helpful?