Table of Contents
์ฝ์ ์ ๋ ฌ์ด๋, ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ๋ฐฐ์ด์ ์์๋ถํฐ ๋๊น์ง ํ์ฌ ๋ฐฐ์ด์ ์์๋ค๊ณผ ๋น๊ตํด ๊ฐ๋ฉด์ ์ ์ ํ ์์น์ ์ฝ์ ํ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
28 13 23 25 19 : ์ด๊ธฐ ๋ฐฐ์ด
28 13 23 25 19 : 2๋ฒ์งธ ์๋ฆฌ 13 ๋ถํฐ ์์
13 28 23 25 19 : 13์ ์ ์ ํ ์๋ฆฌ๋ฅผ ์ฐพ์๊ฐ๊ณ ๋ค์์ผ๋ก 3๋ฒ์งธ ์๋ฆฌ 23์ ๋ณธ๋ค.
13 23 28 25 19 : 23๋ ์ ์ ํ ์๋ฆฌ๋ฅผ ์ฐพ์๊ฐ๊ณ ๋ค์์ผ๋ก 4๋ฒ์งธ ์๋ฆฌ 25๋ฅผ ๋ณธ๋ค.
13 23 25 28 19 : 25๋ ์ ์ ํ ์๋ฆฌ๋ฅผ ์ฐพ์๊ฐ๊ณ ๋ค์์ผ๋ก 5๋ฒ์จฐ ์๋ฆฌ 19๋ฅผ ๋ณธ๋ค.
13 19 23 25 28 : ์ ๋ ฌ ์๋ฃ!
void insertionSort(int[] arr)
{
for(int index = 1 ; index < arr.length ; index++){
int temp = arr[index];
int aux = index - 1;
while( (aux >= 0) && ( arr[aux] > temp ) ) {
arr[aux+1] = arr[aux];
aux--;
}
arr[aux + 1] = temp;
}
}
//์ถ์ฒ ์ํคํผ๋์
์ ํ์ ๋ ฌ์ด๋, ์ฃผ์ด์ง ๋ฐฐ์ด ์ค์ ์ต์๊ฐ์ ์ฐพ์ ์ ๋ ฌ ๋์ง ์์ ๋ฐฐ์ด์ ๋งจ์์ ๊ฐ๊ณผ ์๋ฆฌ๋ฅผ ๋ฐ๊พธ์ด ๋๊ฐ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๋ฐฐ์ด์ ๋งจ์๋ถํฐ ์ฐจ๋ก๋ก ์ ๋ ฌ์ด ๋๋ค.
28 13 23 25 19 : ์ด๊ธฐ๋ฐฐ์ด
13 28 23 25 19 : ์ต์๊ฐ 13์ ๋งจ ์์ ์ 28๊ณผ ์๋ฆฌ ๋ฐ๊พธ๊ธฐ
13 19 23 25 28 : ๋ค์ ์ต์๊ฐ 19๋ฅผ ๋งจ ์์ ์ 28๊ณผ ์๋ฆฌ ๋ฐ๊พธ๊ธฐ
13 19 23 25 28 : ๋ค์ ์ต์๊ฐ์ 23์ด๋๊น ์๋ฆฌ ๊ทธ๋๋ก!
13 19 23 25 28 : ๋ค์ ์ต์๊ฐ์ 25์ด๋๊น ์๋ฆฌ ๊ทธ๋๋ก!
13 19 23 25 28 : ์ ๋ ฌ ์๋ฃ!
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;
}
}
//์ถ์ฒ ์ํคํผ๋์
๊ฑฐํ์ ๋ ฌ์ด๋, ์ธ์ ํ ๋ ์์๋ฅผ ๋น๊ตํด ๊ฐ๋ฉด์ ์๋ฆฌ๋ฅผ ๋ฐ๊พธ๋ ๋ฐฉ์์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๋ฐฐ์ด์ ๋งจ๋ค๋ถํฐ ์ฐจ๋ก๋ก ์ ๋ ฌ์ด ๋๋ค.
(28 13) 23 25 19 : 28 > 13 Change!
13 (28 23) 25 19 : 28 > 23 Change!
13 23 (28 25) 19 : 28 > 25 Change!
13 23 25 (28 19) : 28 > 19 Change!
(13 23) 25 19 28 : 28 ์ต๋๊ฐ์ผ๋ก ๊ณ ์ , 13 < 23 Pass!
13 (23 25) 19 28 : 23 < 25 Pass!
13 23 (25 19) 28 : 25 > 19 Change!
(13 23) 19 25 28 : 25 ๋ค์ ์ต๋๊ฐ์ผ๋ก ๊ณ ์ , 13 < 23 Pass!
13 (23 19) 25 28 : 23 > 19 Change!
(13 19) 23 25 28 : 23 ๋ค์ ์ต๋๊ฐ์ผ๋ก ๊ณ ์ , 13 < 19 Pass!
13 19 23 25 28 : 19 ๋ค์ ์ต๋๊ฐ์ผ๋ก ๊ณ ์ , ์ ๋ ฌ ์๋ฃ!
void bubbleSort(int[] arr) {
int temp = 0;
for(int i = 0; i < arr.length; 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;
}
}
}
System.out.println(Arrays.toString(arr));
}
ํฉ๋ณ์ ๋ ฌ์ ๋ฌธ์ ๋ฅผ ๋ถ๋ฆฌํ๊ณ ๊ฐ๊ฐ์ ํด๊ฒฐํ ํ ๋ค์ ํฉ์น๋ Divide & Concuer ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
- Divide(๋ถํ ) : ์ด๊ธฐ ๋ฐฐ์ด์ 2๊ฐ์ ๋ฐฐ์ด๋ก ๋ถํ ํ๋ค.
- Conquer(์ ๋ณต) : ๊ฐ ๋ถ๋ถ๋ฐฐ์ด์ ์ฌ๊ท์ ์ผ๋ก ๋ณํฉ์ ๋ ฌ์ ์ฌ์ฉํ์ฌ ์ ๋ ฌํ๋ค.
- Combine(๊ฒฐํฉ) : ๋ถ๋ถ๋ฐฐ์ด์ ํ๋์ ๋ฐฐ์ด๋ก ๊ฒฐํฉํ๋ค.
void mergeSort(int[] arr, int start, int end) {
if (start < end) {
int mid = (start + end) / 2;
mergeSort(arr, start, mid);
mergeSort(arr, mid + 1, end);
merge(arr, start, mid, end);
}
}
void merge(int[] arr, int start, int mid, int end) {
int i = start; // ์ผ์ชฝ ๋ฐฐ์ด์ ์์
int j = mid + 1; // ์ค๋ฅธ์ชฝ ๋ฐฐ์ด์ ์์
int k = 0; // ๋ณํฉ๋ ๋ฐฐ์ด์ ์์
int[] temp = new int[end - start + 1];
while (i <= mid && j <= end) {
if (arr[i] < arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
}
}
// ๋จ์ ๊ฐ ๋ณต์ฌ
if (i > mid) { // ์ผ์ชฝ ๋ฐฐ์ด ๊ฐ ๋ค ์ฌ์ฉํจ , ์ค๋ฅธ์ชฝ ๋ค ๋ณต์ฌ
for (int idx = j; idx <= end; idx++, k++) {
temp[k] = arr[idx];
}
} else { // ์ค๋ฅธ์ชฝ ๋ฐฐ์ด ๊ฐ ๋ค ์ฌ์ฉํจ, ์ผ์ชฝ ๋ค ๋ณต์ฌ
for (int idx = i; idx <= mid; idx++, k++) {
temp[k] = arr[idx];
}
}
// ์์ ๋ฐฐ์ด -> ์๋ ๋ฐฐ์ด
for (int num : temp) {
arr[start++] = num;
}
}
- ์์ ์ ์ธ ์ ๋ ฌ ๋ฐฉ๋ฒ์ด๋ค. ์ ๋ ฅ๋ฐ์ดํฐ์ ๋ถํฌ์ ์๊ด์์ด ๋ฅผ ์ ์ง ํ ์ ์๋ค.
- ๋ฐฐ์ด์ ์ฌ์ฉํ๋ฉด ์์ ๋ฐฐ์ด์ ์ฌ์ฉํด์ผ ํ๋ค.
- ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ์ปค์ง๋ฉด ๋ฐ์ดํฐ์ ์ด๋ ํ์๊ฐ ๋ง์์ ธ ์๊ฐ์ด ์ปค์ง ์ ์๋ค.
ํฉ๋ณ์ ๋ ฌ์ ๋ฌธ์ ๋ฅผ ๋ถ๋ฆฌํ๊ณ ๊ฐ๊ฐ์ ํด๊ฒฐํ ํ ๋ค์ ํฉ์น๋ Divide & Concuer ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
- ์ฃผ์ด์ง ๋ฐฐ์ด์์ pivot์ ์ ์ ํ๋ค.(๋ฐ์ ์์ค์ฝ๋์์ ๋งจ ์์ ๊ฐ์ผ๋ก ํจ)
- pivot์ ๊ธฐ์ค์ผ๋ก ์์ ๊ฐ๋ค์ด ๋ชจ์ธ ๋ฐฐ์ด๊ณผ ํฐ ๊ฐ๋ค์ด ๋ชจ์ธ ๋ฐฐ์ด๋ก ๋น๊ท ๋ฑํ๊ฒ ๋ฐฐ์ด์ ๋ ๋ถ๋ถ์ผ๋ก ๋๋๋ค.
- ํด๋น pivot์ ๊ธฐ์ค์ผ๋ก ๋ฐฐ์ด์ ๋๋๊ณ ๋๋ฉด pivot์ ๊ณ ์ ๋๋ค. (์ฌ๊ท ํธ์ถ๋ง๋ค pivot์ ์์น๋ ๋งค๋ฒ ๊ณ ์ ๋๋ฏ๋ก ์ด ์๊ณ ๋ฆฌ์ฆ์ด ๋ฐ๋์ ๋๋๋ ๊ฒ์ ๋ณด์ฅํ๋ค.)
- ๋ถํ ๋ ๋ ๋ฐฐ์ด์์ ์ฌ๊ท์ ์ผ๋ก ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
3 7 6 5 1 4 2 : ์ด๊ธฐ๋ฐฐ์ด
pivot = 3
3 7 6 5 1 4 2 : low = 1, high = 6, swap!
3 2 6 5 1 4 7 : low = 2, high, = 5
3 2 6 5 1 4 7 : low = 2, high = 4, swap!
3 2 1 5 6 4 7 : low = 3, high = 3
3 2 1 5 6 4 7 : low = 3, high = 2 (์๋ก ์ง๋์นจ) => high ์ pivot swap!
1 2 3 5 6 4 7
pivot = 1
...
pivot = 5
...
void quickSort(int[] arr, int start, int end) {
if (start < end) { // ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ์ถฉ๋ถํ ์์ ์ง ๋ ๊น์ง ๋๋
int p = partition(arr, start, end); // ํํฐ์
์ ์ ์ฉ ํ์ ๋ ํผ๋ด์ ์ธ๋ฑ์ค๋ฅผ ๊ตฌํจ
quickSort(arr, start, p - 1); // ์ฒ์ ๋ถํฐ ํผ๋ด ์ ,
quickSort(arr, p + 1, end); // ํผ๋ด ํ ๋ถํฐ ๋ง์ง๋ง ๊น์ง ๋ค์ ํต์ํธ๋ฅผ ํจ
}
}
int partition(int[] arr, int start, int end) {
int low = start + 1; // pivot์ ๋งจ ์ผ์ชฝ ๊ฐ์ผ๋ก ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ทธ ๋ค์ ๊ฐ๋ถํฐ ํ์ธ
int high = end;
int pivot = arr[start]; // ๊ฐ์ฅ ์ผ์ชฝ ๊ฐ์ pivot์ผ๋ก ์ค์
while (low <= high) { // ์์ชฝ์์ ํ์ํ๋ฉด์ ๋์ด ๊ฒน์ณ์ ธ ์ง๋์น ๋ ๊น์ง ํ๋ค.
while (low <= end && arr[low] < pivot) { // ์์์ ๋ถํฐ ๋น๊ต์ค pivot ๋ณด๋ค ํฌ๋ฉด stop
low++;
}
while (high >= start && arr[high] > pivot) { // ๋ค์์ ๋ถํฐ ๋น๊ต์ค pivot ๋ณด๋ค ์์ผ๋ฉด stop
high--;
}
if (low < high) { // low , high ๊ฐ ๊ฒน์ณ์ ธ ์ง๋์น๊ฒ ์๋๋ฉด ๋์ ๋ฐ๊ฟ์ค
swap(arr, low, high);
}
}
swap(arr, start, high); // ๋ง์ง๋ง์ผ๋ก pivot๊ณผ high index์ ๊ฐ์ ๋ฐ๊พธ๋ฉด high index ๊ฐ pivot์ index๊ฐ ๋จ
return high; // pivot ์์น ๋ฐํ
}
void swap(int[] arr, int i, int j) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
- ์๋๊ฐ ๋งค์ฐ ๋น ๋ฅด๋ค
- ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ์๋ก ํ์ง ์๋๋ค
- ๋ถ๊ท ํ ๋ถํ ์ด ๋ง์์ง ๊ฒฝ์ฐ ์ต์
์ ๊ฒฝ์ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ์ ์๋ค.
- ๋ถ๊ท ํ ๋ถํ ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ธ ๊ฐ์ ์ค์๋ฒ์ ์ฌ์ฉํด์ ํผ๋ฒ์ ์ ํํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๋ค average case ์ด๊ณ ์ฌ์ง์ด Quick Sort๋ worst case ์ด๋ค. ํ์ง๋ง ๋ณดํต ์ผ๋ฐ์ ์ผ๋ก ํต์ํธ๊ฐ ๋น ๋ฅธ๊ฒ์ผ๋ก ์๊ณ ์๋ค.
์ผ๋จ Quick Sort ์ worst case ๋ (๋งจ์์ ์๋ฅผ pivot์ผ๋ก ๊ฐ์ ) ์์ด๋ฌ๋ ํ๊ฒ ์ ๋ ฌ์ด ์ ๋์ด ์๋ ๋ฐฐ์ด์์ ๋์จ๋ค.
์ด๋ ๊ฒ Quick Sort์ worst case ์ ํ๊ท ์ ์ธ Merge Sort ๋ฅผ ๋น๊ตํด ๋ณด์๋ Quick Sort๊ฐ ๋ ๋น ๋ฅด๊ฒ ๋์จ๋ค. ๊ทธ ์ด์ ๋ ์ค์ ์๊ฐ ์ ๋ ฌ ๋๋ ์ค Merge Sort๋ ๋ถํ ๊ณผ์ ์์ ์ถ๊ฐ์ ์ธ ๋ฐฐ์ด์ ์์ฑํด์ผ ํ๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค. ์ด๋ฌํ ๊ณผ์ ์์ ๊ณ์์ ์ผ๋ก Delay ๊ฐ ์๊ธฐ๋ค ๋ณด๋ ๊ฒฐ๊ณผ์ ์ผ๋ก Quick Sort๊ฐ ๋์ฑ ๋น ๋ฅด๊ฒ ์ ๋ ฌ์ด ๋๋ ๊ฒ์ด๋ค.
์๋์ ์๋ฃ์์ ์์ธํ ์ค๋ช ๊ณผ ์ฝ๋๋ฅผ ๋ณผ ์ ์๋ค.
- ์์ฑ์ ์ด์ธ๋ช | Heap, Radix, Counting Sort