๐ป ์๊ณ ๋ฆฌ์ฆ: Algorithm
์ ํ ์ ๋ ฌ (Selection Sort)
"๊ฐ์ฅ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ํํ์ฌ ๋งจ ์์ ๋ฐ์ดํฐ์ ์์๋ฅผ ๋ฐ๊พผ๋ค"
i๋ฒ์งธ ์์น์ ๊ฐ์ ๋ํ์ฌ i+1๋ฒ์งธ๋ถํฐ ๋ง์ง๋ง ์์๊น์ง ๋น๊ตํ์ฌ ๊ฐ์ฅ ์์ ๊ฐ์ ์ฐพ์๋ด ํ์ฌ i๋ฒ์งธ ์์น์ ๊ฐ๊ณผ ์๋ฆฌ๋ฅผ ๋ฐ๊ฟ์ฃผ๋ ์ฐ์ฐ์ ์ํํ๋ค. ์ฆ 0~i-1๊น์ง ์ด๋ฏธ ์ค๋ฆ์ฐจ์์ผ๋ก ์ฐพ์๋ธ ์ ๋ฆฌ๋ ๊ฐ๋ค์ ๋๊ณ , ํ์ฌ ์์น์ ๋ค์ด๊ฐ ์ต์๊ฐ์ ์ ๋ ฌ์ด ์๋ ์์๋ค ์ฌ์ด์์ ์ฐพ์๋ด ์ ํํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ต์๊ฐ์ ์ฐพ๋ ์ ์ฒด ํ์์ ๋ชจ๋ ์์์ ๋ํด ์ํํ๋ฏ๋ก Time Complexity๋ O(N^2)์ด ๋๋ค.
>> ํน์ง
- ๊ฐ์ฅ ์์์ ์ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ์๊ฐ๋ณต์ก๋: O(N^2)
>> ์์ค์ฝ๋
void selectionSort(int arr[], int size) {
int minIndex;
int i, j;
for (i = 0; i < size - 1; i++) {
minIndex = i;
for (j = i + 1; j < size; j++)
if (arr[j] < arr[minIndex])
minIndex = j;
swap(&arr[i], &arr[minIndex]);
}
}
#ํ์ด์ฌ
arr = [1, 5, 3, 4, 2, 88, 4, 7, -1, 0]
n = len(arr)
for i in range(0, n-1):
least = i
for j in range (i+1, n):
if arr[least] > arr[j]:
least = j
arr[i], arr[least] = arr[least], arr[i]
๋ฒ๋ธ ์ ๋ ฌ (Bubble Sort)
์ธ์ ํ ๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํด๊ฐ๋ฉฐ ์ ๋ ฌ์ ์งํํ๋ ๋ฐฉ์์ด๋ค.
ํ ๋ฒ์ ์ฐ์ฐ๋ง๋ค ์ ๋ ฌ์ด ์๋ ๋ชจ๋ ๊ฐ๋ค์ ๋ํด ์ธ์ ๋น๊ต๋ฅผ ์ํํ๋ฉฐ, ๊ทธ ์ค์์ ๊ฐ์ฅ ํฐ ๊ฐ์ด ๋ฐฐ์ด์ ๋งจ ๋์ผ๋ก ์ ๋ ฌ๋๋ค. ์ด์ ๊ฐ์ ์ฐ์ฐ์ n๋ฒ ๋ฐ๋ณตํ๋ฏ๋ก Time Complexity๋ O(N^2)์ด ๋๋ค.
>> ํน์ง
- ์๊ฐ๋ณต์ก๋: O(N^2)
>> ์์ค์ฝ๋
//์๋ฐ
void bubbleSort(int arr[], int size) {
int i, j;
for (i = size - 1; i>0; i--)
for (j = 0; j<i; j++)
if (arr[j]<arr[j + 1])
swap(arr[j], arr[j + 1]);
}
#ํ์ด์ฌ
arr = [1, 5, 3, 4, 2, 88, 4, 7, -1, 0]
n = len(arr)
for i in range(n-1):
for j in range (n-1-i):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
์ฝ์ ์ ๋ ฌ (Insertion Sort)
"๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ํ์ธํ๋ฉฐ, ์ ์ ํ ์์น์ ์ฝ์ ํ๋ค."
n๊ฐ์ ์์๋ฅผ ๊ฐ์ง ๋ฐฐ์ด์ ์ ๋ฆฌํ ๋, i๋ฒ์งธ๋ฅผ ์ ๋ ฌํ ์์๋ผ๊ณ ํ๋ค๋ฉด 0๋ถํฐ i-1๋ฒ์งธ๊น์ง๋ ์ ๋ ฌ๋์ด ์๋ค๋ ๊ฐ์ ํ์ i๋ฒ์งธ ์์๊ฐ ๋ค์ด๊ฐ ์์น๋ฅผ ์ฐพ๋ ์ฐ์ฐ์ ์ํํ๋ค. ์ด ๊ณผ์ ์ ๋ฐฐ์ด์ ๋ง์ง๋ง ์์๊น์ง ๋ฐ๋ณตํด์ฃผ๋ฏ๋ก Time Complexity๋ O(N^2)์ด ๋๋ค.
>> ํน์ง
- ํ์ํ ๋๋ง ์์น๋ฅผ ๋ฐ๊พธ๋ฏ๋ก ๋ฐ์ดํฐ๊ฐ ๊ฑฐ์ ์ ๋ ฌ๋์ด ์์ ๋ ํจ๊ณผ์ ์ด๋ค.
- ์๊ฐ๋ณต์ก๋: O(n^2)
- ๋จ, ๊ฑฐ์ ์ ๋ ฌ๋์ด ์๋ ์ํ๋ผ๋ฉด ๋ฃจํ ์์ ๋ฐ๋ณต๋ฌธ์ด 1ํ๋ง ์ค์๋๊ณ ๋ง๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋์ํ์ฌ O(N)์ ์ฑ๋ฅ์ ๋ณด์ธ๋ค.
>> ์์ค์ฝ๋
void insertionSort(int arr[], int size) {
int i, j,key;
for (i = 1; i < size; i++) {
key = arr[i];
j = i - 1;
while (j >= 0&&arr[j]>key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
#ํ์ด์ฌ
arr = [1, 5, 3, 4, 2, 88, 4, 7, -1, 0]
n = len(arr)
for i in range(1, n):
key = arr[i]
j = i-1
while j >= 0 and arr[j] > key:
arr[j+1] = arr[j]
j = j-1
arr[j+1] = key
ํต ์ ๋ ฌ (Quick Sort)
"๊ธฐ์ค์ด ๋๋ ํผ๋ฒ(Pivot)์ ์ ํ ๋ค ํฐ์์ ์์ ์๋ฅผ ๊ตํํ ํ ๋ฆฌ์คํธ๋ฅผ ๋ฐ์ผ๋ก ๋๋๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค."
ํผ๋ฒ์ ์ด๋ป๊ฒ ์ ํ๋ ์ง๋ฅผ ๋ฏธ๋ฆฌ ๋ช ์ํด์ผ ํ๋๋ฐ, ๋ณดํต '๋ฆฌ์คํธ์์ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ๋ฅผ ํผ๋ฒ์ผ๋ก ์ ํ๋ค'๋ ํธ์ด ๋ถํ ๋ฐฉ์์ ๊ธฐ์ค์ผ๋ก ์ผ๋๋ค.
ํผ๋ฒ์ ์ค์ ํ ๋ค์๋ ์ผ์ชฝ๋ถํฐ ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ณ , ์ค๋ฅธ์ชฝ๋ถํฐ ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ผ๋ฉฐ ์๋ก ๊ตํํ๋ค.
>> ํน์ง
- ํ์ด์ฌ์ด๋ ์๋ฐ์์ ์ ๋ ฌ ๋ด์ฅํจ์์ ๊ธฐ๋ณธ์ด ๋๋ค.
- ์ฌ๊ทํจ์์ ๋์ ์๋ฆฌ๊ฐ ๊ฐ๋ค.
- ์๊ฐ๋ณต์ก๋: ํ๊ท ์ ์ผ๋ก O(N^2), ์ต์ ์ ๊ฒฝ์ฐ O(N^2)์ด๋ค. ํผ๋ด๊ฐ์ ์ ํ์ ๋ฐ๋ผ ํฌ๊ฒ ๋ฌ๋ผ์ง๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ์์์ ๊ฐ์๊ฐ ์ ์ด์ง์๋ก ๋์ ์ค๊ฐ๊ฐ์ด ์ ํ๋ ํ๋ฅ ์ด ๋์์ง๊ธฐ ๋๋ฌธ์, ์์์ ๊ฐ์์ ๋ฐ๋ผ ํต ์ ๋ ฌ์ ๋ค๋ฅธ ์ ๋ ฌ์ ํผํฉํด์ ์ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
- ๋ณํฉ ์ ๋ ฌ์ ํญ์ ์ ์ค์์ ๊ธฐ์ค์ผ๋ก ๋จ์ ๋ถํ ํ ๋ณํฉ ์์ ์์์ ๊ฐ์ ๋น๊ต ์ฐ์ฐ์ด ๋ฐ์ํ๋ ๋ฐ๋ฉด์, ํต ์ ๋ ฌ์ ๋ถํ ์์ ๋ถํฐ ๋น๊ต์ฐ์ฐ์ด ์ผ์ด๋๊ธฐ ๋๋ฌธ์ ๊ทธ ์ดํ ๋ณํฉ์ ๋ค์ด๊ฐ๋ ๋น์ฉ์ด ๋งค์ฐ ์ ๊ฑฐ๋ ๊ตฌํ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ์์ ๋ณํฉ์ ํ์ง ์์ ์๋ ์๋ค.
>> ์์ค ์ฝ๋
//์๋ฐ
public class QuickSorter {
public static List<Integer> quickSort(List<Integer> list) {
if (list.size() <= 1) return list;
int pivot = list.get(list.size() / 2);
List<Integer> lesserArr = new LinkedList<>();
List<Integer> equalArr = new LinkedList<>();
List<Integer> greaterArr = new LinkedList<>();
for (int num : list) {
if (num < pivot) lesserArr.add(num);
else if (num > pivot) greaterArr.add(num);
else equalArr.add(num);
}
return Stream.of(quickSort(lesserArr), equalArr, quickSort(greaterArr))
.flatMap(Collection::stream)
.collect(Collectors.toList());
}
}
#ํ์ด์ฌ
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
lesser_arr, equal_arr, greater_arr = [], [], []
for num in arr:
if num < pivot:
lesser_arr.append(num)
elif num > pivot:
greater_arr.append(num)
else:
equal_arr.append(num)
return quick_sort(lesser_arr) + equal_arr + quick_sort(greater_arr)
๋ณํฉ ์ ๋ ฌ (Merge Sort)
Divide and Conquer. ์ฆ, ์ด๋ค ๋ฌธ์ ๋ฅผ ์ฐ์ ์๊ฒ ์ชผ๊ฐ๊ณ ๋ ํ, ๋ค์ ์กฐํฉํ์ฌ ์๋์ ๋ฌธ์ ๋ฅผ ํธ๋ ๋ฐฉ์์ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์ฃผ์ด์ง ๋ฐฐ์ด์ ์ต์๊ธธ์ด๊ฐ ๋ ๋๊น์ง ๊ณ์ํด์ ์ ๋ฐ์ผ๋ก ๋ถํ ํ์ฌ ๋ถ๋ถ ๋ฆฌ์คํธ๋ก ๋๋๊ณ , ์ธ์ ํ ๋ถ๋ถ ๋ฐฐ์ด๋ผ๋ฆฌ ์ ๋ ฌํ์ฌ ํฉ์น๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
>> ํน์ง
- ์๊ฐ๋ณต์ก๋: O(N*logN)
- ์ ๋ฐ์ฉ ๋ถํ ํ๋ ๊ณผ์ ์์ O(logN)์ ์๊ฐ์ด, ๋ณํฉํ๋ฉฐ ๋ชจ๋ ๊ฐ๋ค์ ์์๋ฅผ ๋น๊ตํ๋ O(N)์ ์๊ฐ์ด ์๋ชจ๋๋ค.
- ๋ ๊ฐ์ ๋ฐฐ์ด์ ๋ณํฉํ ๋, ๋ณํฉ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ ๋์ ๋ฐฐ์ด์ด ์ถ๊ฐ๋ก ํ์ํ๊ธฐ ๋๋ฌธ์ ๊ณต๊ฐ ๋ณต์ก๋๋ O(N)์ด ๋๋ค.
- ๋ค๋ฅธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ฌ๋ฆฌ, ์ธ์ ํ ๊ฐ๋ค ๊ฐ์ ์ํธ ์๋ฆฌ ๊ต๋(swap)๊ฐ ์ผ์ด๋์ง ์๋๋ค.
>> ์์ค์ฝ๋
// ์๋ฐ
public class MergeSorter {
public static int[] sort(int[] arr) {
if (arr.length < 2) return arr;
int mid = arr.length / 2;
int[] low_arr = sort(Arrays.copyOfRange(arr, 0, mid));
int[] high_arr = sort(Arrays.copyOfRange(arr, mid, arr.length));
int[] mergedArr = new int[arr.length];
int m = 0, l = 0, h = 0;
while (l < low_arr.length && h < high_arr.length) {
if (low_arr[l] < high_arr[h])
mergedArr[m++] = low_arr[l++];
else
mergedArr[m++] = high_arr[h++];
}
while (l < low_arr.length) {
mergedArr[m++] = low_arr[l++];
}
while (h < high_arr.length) {
mergedArr[m++] = high_arr[h++];
}
return mergedArr;
}
}
# ํ์ด์ฌ
def merge_sort(arr):
if len(arr) < 2:
return arr
mid = len(arr) // 2
low_arr = merge_sort(arr[:mid])
high_arr = merge_sort(arr[mid:])
merged_arr = []
l = h = 0
while l < len(low_arr) and h < len(high_arr):
if low_arr[l] < high_arr[h]:
merged_arr.append(low_arr[l])
l += 1
else:
merged_arr.append(high_arr[h])
h += 1
merged_arr += low_arr[l:]
merged_arr += high_arr[h:]
return merged_arr
์ต์ ํ ์ฝ๋๋ ์์ง๋ง, ์ด ๊ธ์์๋ ์ด ์ ๋๋ก๋ง ์ ๋ฆฌํ๊ฒ ๋ค.
ํ ์ ๋ ฌ (Heap Sort), ๊ณ์ ์ ๋ ฌ (Count Sort), ๊ธฐ์ ์ ๋ ฌ (Radix Sort)
์ ๋ฆฌ ์ค...
โโโ
- 54321๋ก ์ ๋ ฌ๋ ๋ฐฐ์ด์ด ์์ ๋, ์ด๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ฆฌํ๋ ค๋ฉด ์ด๋ค ์ ๋ ฌ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์๊ฐ?
- ์์๋ค์ด ๋๋ค์ผ๋ก ๋ฐฐ์น๋ ๋ฐฐ์ด์ด ์์ ๋, ์ด๋ค ์ ๋ ฌ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์๊ฐ?
- ์๋ฆฟ์๊ฐ ๋ชจ๋ ๊ฐ์ ์๊ฐ ๋ด๊ธด ๋ฐฐ์ด์ด ์์ ๋, ์ด๋ค ์ ๋ ฌ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์๊ฐ?
๐ ๐ ๐
๏ผฐ๏ฝ๏ฝ๏ฝ๏ฝ ๏ฝ ๏ผข๏ฝ ๏ผณ๏ผก๏ผน
๐๐ฉ๐ข๐ฏ๐ฌ๐ด ๐ง๐ฐ๐ณ ๐ณ๐ฆ๐ข๐ฅ๐ช๐ฏ๐จ