๐ฆ 5. Sorting
5. Sorting
๋ฒ๋ธ ์ ๋ ฌ (bubble sort)
- ํ๊ท ๋ฐ ์ต์
์ ๊ฒฝ์ฐ
O(n^2)
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
O(1)
๋ฐฐ์ด์ ์ฒซ ์์๋ถํฐ ์์ฐจ ์คํ.
ํ์ฌ ์์๊ฐ ๊ทธ๋ค์ ์์์ ๊ฐ๋ณด๋ค ํฌ๋ฉด ๋ ์์๋ฅผ ๋ฐ๊พผ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
void bubbleSort(int[] arr) {
int temp = 0;
for(int i = 0; i < arr.length - 1; i++) {
for(int j = 1; j < arr.length - i; j++) {
if(arr[j] < arr[j - 1]) {
temp = arr[j - 1];
arr[j - 1] = arr[j];
arr[j] = temp;
}
}
}
}
์ ํ ์ ๋ ฌ (selection sort)
- ํ๊ท ๋ฐ ์ต์
์ ๊ฒฝ์ฐ
O(n^2
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
O(1)
๋ฐฐ์ด์ ์ ํ ํ์ํ๋ฉฐ ๊ฐ์ฅ ์์ ์์๋ฅผ ๋ฐฐ์ด์ ๋งจ ์์ผ๋ก ๋ณด๋ธ๋ค.
๊ทธ ๋ค์์๋ ๋ ๋ฒ์งธ ์์ ์์๋ฅผ ์ฐพ์ 2๋ฒ์งธ ์๋ฆฌ๋ก ๋ณด๋ธ๋ค.
์ด๋ฅผ ๋ชจ๋ ์์๊ฐ ์ ๋ ฌ๋ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void selectionSort(int[] list) {
int indexMin, temp;
for (int i = 0; i < list.length - 1; i++) {
indexMin = i;
for (int j = i + 1; j < list.length; j++) {
if (list[j] < list[indexMin]) {
indexMin = j;
}
}
temp = list[indexMin];
list[indexMin] = list[i];
list[i] = temp;
}
}
๋ณํฉ ์ ๋ ฌ (merge sort)
- ํ๊ท ๋ฐ ์ต์
์ ๊ฒฝ์ฐ
O(n log n)
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
์ํฉ์ ๋ฐ๋ผ ๋ค๋ฆ, ๋๋ O(n)
๋ฐฐ์ด์ ์ ๋ฐ์ฉ ๋๋์ด ๊ฐ๊ฐ์ ์ ๋ ฌํ ๋ค์ ์ด ๋์ ํฉ์ณ์ ๋ค์ ์ ๋ ฌํ๋ค.
๋๋ ์ ๋ฐ์ ์ ๋ ฌํ ๋๋ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ์ฉ๋๊ณ ๊ฒฐ๊ตญ์๋ ์์ ํ ๊ฐ์ง๋ฆฌ ๋ฐฐ์ด ๋ ๊ฐ๋ฅผ ๋ณํฉํ๋ค.
๋ณํฉ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๊ฐ์ฅ ๋ณต์กํ๋ค.
๋ณํฉ ๋์์ด ๋๋ ๋ฐฐ์ด์ ๋ ๋ถ๋ถ์ ์์ ๋ฐฐ์ด helper
์ ๋ณต์ฌํ๊ณ
์ผ์ชฝ ์ ๋ฐ์ ์์ ์ง์ helperLeft
์ ์ค๋ฅธ์ชฝ ์ ๋ฐ์ ์์ ์ง์ helperRight
๋ฅผ ์ถ์ ํ๋ค.
์ดํ helper
๋ฅผ ์ํํ๋ฉฐ ๋ ๋ฐฐ์ด์์ ๋ ์์ ๊ฐ์ ์์๋ฅผ ๊บผ๋ด์ด ์๋ ๋ฐฐ์ด์ ๋ณต์ฌํด ๋ฃ๋๋ค.
๋ ๋ฐฐ์ด ์ค ํ ๋ฐฐ์ด์ ๋ํ ์ํ๊ฐ ๋๋ ๊ฒฝ์ฐ, ๋ค๋ฅธ ๋ฐฐ์ด์ ๋จ์ ๋ถ๋ถ์ ์๋ ๋ฐฐ์ด์ ๋จ๊น์์ด ๋ณต์ฌํด ๋ฃ๊ณ ์์ ์ ๋ง์น๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
void mergesort(int[] array) {
int[] helper = new int[array.length];
mergesort(array, helper, 0, array.length - 1);
}
void mergesort(int[] array, int[] helper, int low, int high) {
if (low < high) {
int middle = (low + high) / 2;
mergesort(array, helper, low, middle); // ์ผ์ชฝ ์ ๋ฐ ์ ๋ ฌ
mergesort(array, helper, middle + 1, high); //์ค๋ฅธ์ชฝ ์ ๋ฐ ์ ๋ ฌ
sort(array, helper, low, middle, high); //๋ณํฉ
}
}
void merge(int[] array, int[] helper, int low, int middle, int high) {
/** ์ ๋ฐ์ง๋ฆฌ ๋ ๋ฐฐ์ด์ helper ๋ฐฐ์ด์ ๋ณต์ฌํ๋ค */
for (int i = low; i <= high; i++) {
helper[i] = array[i];
}
int helperLeft = low;
int helperRight = middle + 1;
int current = low;
while (helperLeft <= middle && helperRight <= high) {
if (helper[helperLeft] <= helper[helperRight]) {
array[current] = helper[helperLeft];
helperLeft++;
} else {
array[current] = helper[helperRight];
helperRight++;
}
current++;
}
int remaining = middle - helperLeft;
for (int i = 0; i <= remaining; i++) {
array[current + i] = helper[helperLeft + i];
}
}
์ค๋ฅธ์ชฝ ์ ๋ฐ์ ๋ํ ๋จ์ ์์๋ค์ ์๋ ๋ฐฐ์ด๋ก ๋ค์ ์ฎ๊ธฐ๋ ์ฝ๋๊ฐ ์กด์ฌํ์ง ์๋๋ฐ,
๊ทธ ์ด์ ๋ ์ค๋ฅธ์ชฝ ์์๋ค์ ์ด๋ฏธ ์๋ ๋ฐฐ์ด์ ๊ทธ ์๋ฆฌ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํต ์ ๋ ฌ (quick sort)
ํ๊ท O(n log n)
์ต์ O(n^2)
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
O(log n)
๋ฌด์์๋ก ์ ์ ๋ ํ ์์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ ๋ถํ ํ๋ค.
์ ์ ๋ ์์๋ณด๋ค ์์ ์์๋ค์ ์์ผ๋ก, ํฐ ์์๋ค์ ๋ค๋ก ๋ณด๋ธ๋ค.
๋ฐฐ์ด๊ณผ ๊ทธ ๋ถ๋ถ ๋ฐฐ์ด์ ๋ฐ๋ณต์ ์ผ๋ก ๋ถํ ํด ๋๊ฐ๋ฉด ๊ฒฐ๊ตญ ๋ฐฐ์ด์ ์ ๋ ฌ๋ ์ํ์ ๋๋ฌํ๋ค.
๋ฐฐ์ด ๋ถํ ์ ์ฌ์ฉ๋๋ ์์๊ฐ ์ค๊ฐ๊ฐ medium
์ ๊ฐ๊น์ด ๊ฐ์ด ๋๋ฆฌ๋ผ๋ ๋ณด์ฅ์ด ์๊ธฐ ๋๋ฌธ์
์ต์
์ ๊ฒฝ์ฐ ์ํ ์๊ฐ์ด O(n^2)
๊ฐ ๋๊ธฐ๋ ํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void quickSort(int[] arr, int left, int right) {
int index = partition(arr, left, right);
if (left < index - 1) { //์ผ์ชฝ ์ ๋ฐ ์ ๋ ฌ
quickSort(arr, left, index - 1);
}
if (index < right) { //์ค๋ฅธ์ชฝ ์ ๋ฐ ์ ๋ ฌ
quickSort(arr, index, right);
}
}
int partition(int[] arr, int left, int right) {
int pivot = arr[(left + right) / 2]; // ๋ถํ ๊ธฐ์ค ์์ ์ ์
while (left <= right) {
while (arr[left] < pivot) left++; //์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฎ๊ฒจ์ผ ํ๋ ์์
while (arr[right] > pivot) right--; //์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ์ฎ๊ฒจ์ผ ํ๋ ์์
// ์์๋ฅผ ์ค์
if (left <= right) {
swap(arr, left, right); // ์ค์
left++;
right--;
}
}
return left;
}
๊ธฐ์ ์ ๋ ฌ (radix sort)
- ์คํ ์๊ฐ
O(kn)
๊ธฐ์ ์ ๋ ฌ์ ๋ฐ์ดํฐ๊ฐ ์ ์์ฒ๋ผ ์ ํ ๋นํธ๋ก ๊ตฌ์ฑ๋์ด ์๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
๊ฐ ์๋ฆฟ์๋ฅผ ์ํ์ ๋๊ฐ๋ฉฐ ๊ฐ ์๋ฆฌ์ ๊ฐ์ ๋ฐ๋ผ ๊ทธ๋ฃน์ ๋๋๋ค.
๊ธฐ์ ์ ๋ ฌ์ O(kn)
์ ๋ณต์ก๋๋ฅผ ์ง๋๋ค. (n : ์์์ ๊ฐ์, k : ์๋ฆฟ์์ ๊ฐ์)