Skip to content

Commit

Permalink
first commit
Browse files Browse the repository at this point in the history
  • Loading branch information
gyusuk committed Jun 9, 2019
1 parent c84b5a0 commit e9f6955
Show file tree
Hide file tree
Showing 17 changed files with 2,738 additions and 0 deletions.
186 changes: 186 additions & 0 deletions Algorithm/HeapSort.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
#### ํž™ ์†ŒํŠธ(Heap Sort)

---



์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ•˜๋Š” ํž™(Heap) ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•œ ์ •๋ ฌ ๋ฐฉ์‹

***์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋ž€?***

> ์‚ฝ์ž…ํ•  ๋•Œ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ์ด์ง„ ํŠธ๋ฆฌ


ํž™ ์†ŒํŠธ๋Š” `๋ถˆ์•ˆ์ • ์ •๋ ฌ`์— ์†ํ•จ



**์‹œ๊ฐ„๋ณต์žก๋„**

| ํ‰๊ท  | ์ตœ์„  | ์ตœ์•… |
| :------: | :------: | :------: |
| O(nlogn) | O(nlogn) | O(nlogn) |



##### ๊ณผ์ •

1. ์ตœ๋Œ€ ํž™์„ ๊ตฌ์„ฑ
2. ํ˜„์žฌ ํž™ ๋ฃจํŠธ๋Š” ๊ฐ€์žฅ ํฐ ๊ฐ’์ด ์กด์žฌํ•จ. ๋ฃจํŠธ์˜ ๊ฐ’์„ ๋งˆ์ง€๋ง‰ ์š”์†Œ์™€ ๋ฐ”๊พผ ํ›„, ํž™์˜ ์‚ฌ์ด์ฆˆ ํ•˜๋‚˜ ์ค„์ž„
3. ํž™์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ 1๋ณด๋‹ค ํฌ๋ฉด ์œ„ ๊ณผ์ • ๋ฐ˜๋ณต



<img src="https://t1.daumcdn.net/cfile/tistory/999896445AD4953023">

๋ฃจํŠธ๋ฅผ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋กœ ๋Œ€์ฒด (11 โ†’ 4), ๋‹ค์‹œ ์ตœ๋Œ€ ํž™ ๊ตฌ์„ฑ

<img src="https://t1.daumcdn.net/cfile/tistory/99E1AD445AD4953015">



์ด์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ตœ๋Œ€ ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ๋ฝ‘์•„๋‚ด๋ฉด์„œ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด ํž™ ์†ŒํŠธ



```
public void heapSort(int[] array) {
int n = array.length;
// max heap ์ดˆ๊ธฐํ™”
for (int i = n/2-1; i>=0; i--){
heapify(array, n, i); // 1
}
// extract ์—ฐ์‚ฐ
for (int i = n-1; i>0; i--) {
swap(array, 0, i);
heapify(array, i, 0); // 2
}
}
```



##### 1๋ฒˆ์งธ heapify

> ์ผ๋ฐ˜ ๋ฐฐ์—ด์„ ํž™์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ์—ญํ• 
>
> ์ž์‹๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ๋ถ€๋ชจ๋…ธ๋“œ ๋น„๊ต
>
>
>
> - *n/2-1๋ถ€ํ„ฐ 0๊นŒ์ง€ ์ธ๋ฑ์Šค๊ฐ€ ๋„๋Š” ์ด์œ ๋Š”?*
>
> ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ์ธ๋ฑ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ ์ž์‹๋…ธ๋“œ (i*2 + 1), ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ(i*2 + 2)์ด๊ธฐ ๋•Œ๋ฌธ


##### 2๋ฒˆ์งธ heapify

> ์š”์†Œ๊ฐ€ ํ•˜๋‚˜ ์ œ๊ฑฐ๋œ ์ดํ›„์— ๋‹ค์‹œ ์ตœ๋Œ€ ํž™์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•จ
>
> ๋ฃจํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ง„ํ–‰(extract ์—ฐ์‚ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด)


```
public void heapify(int array[], int n, int i) {
int p = i;
int l = i*2 + 1;
int r = i*2 + 2;
//์™ผ์ชฝ ์ž์‹๋…ธ๋“œ
if (l < n && array[p] < array[l]) {
p = l;
}
//์˜ค๋ฅธ์ชฝ ์ž์‹๋…ธ๋“œ
if (r < n && array[p] < array[r]) {
p = r;
}
//๋ถ€๋ชจ๋…ธ๋“œ < ์ž์‹๋…ธ๋“œ
if(i != p) {
swap(array, p, i);
heapify(array, n, p);
}
}
```

**๋‹ค์‹œ ์ตœ๋Œ€ ํž™์„ ๊ตฌ์„ฑํ•  ๋•Œ๊นŒ์ง€** ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ์ž์‹ ๋…ธ๋“œ๋ฅผ swapํ•˜๋ฉฐ ์žฌ๊ท€ ์ง„ํ–‰



ํ€ต์ •๋ ฌ๊ณผ ํ•ฉ๋ณ‘์ •๋ ฌ์˜ ์„ฑ๋Šฅ์ด ์ข‹๊ธฐ ๋•Œ๋ฌธ์— ํž™ ์ •๋ ฌ์˜ ์‚ฌ์šฉ๋นˆ๋„๊ฐ€ ๋†’์ง€๋Š” ์•Š์Œ.

ํ•˜์ง€๋งŒ ํž™ ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ๋งŽ์ด ํ™œ์šฉ๋˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋•Œ ํ•จ๊ป˜ ๋”ฐ๋ผ์˜ค๋Š” ๊ฐœ๋…์ด `ํž™ ์†ŒํŠธ`



##### ํž™ ์†ŒํŠธ๊ฐ€ ์œ ์šฉํ•  ๋•Œ

- ๊ฐ€์žฅ ํฌ๊ฑฐ๋‚˜ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๊ตฌํ•  ๋•Œ

> ์ตœ์†Œ ํž™ or ์ตœ๋Œ€ ํž™์˜ ๋ฃจํŠธ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๋ฒˆ์˜ ํž™ ๊ตฌ์„ฑ์„ ํ†ตํ•ด ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅ
- ์ตœ๋Œ€ k ๋งŒํผ ๋–จ์–ด์ง„ ์š”์†Œ๋“ค์„ ์ •๋ ฌํ•  ๋•Œ

> ์‚ฝ์ž…์ •๋ ฌ๋ณด๋‹ค ๋”์šฑ ๊ฐœ์„ ๋œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์–ด๋‚ผ ์ˆ˜ ์žˆ์Œ


##### ์ „์ฒด ์†Œ์Šค ์ฝ”๋“œ

```
private void solve() {
int[] array = { 230, 10, 60, 550, 40, 220, 20 };
heapSort(array);
for (int v : array) {
System.out.println(v);
}
}
public static void heapify(int array[], int n, int i) {
int p = i;
int l = i * 2 + 1;
int r = i * 2 + 2;
if (l < n && array[p] < array[l]) {
p = l;
}
if (r < n && array[p] < array[r]) {
p = r;
}
if (i != p) {
swap(array, p, i);
heapify(array, n, p);
}
}
public static void heapSort(int[] array) {
int n = array.length;
// init, max heap
for (int i = n / 2 - 1; i >= 0; i--) {
heapify(array, n, i);
}
// for extract max element from heap
for (int i = n - 1; i > 0; i--) {
swap(array, 0, i);
heapify(array, i, 0);
}
}
public static void swap(int[] array, int a, int b) {
int temp = array[a];
array[a] = array[b];
array[b] = temp;
}
```

165 changes: 165 additions & 0 deletions Algorithm/MergeSort.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
#### ๋จธ์ง€ ์†ŒํŠธ(Merge Sort)

---



ํ•ฉ๋ณ‘ ์ •๋ ฌ์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋ฉฐ, ๋ถ„ํ•  ์ •๋ณต ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ๊ตฌํ˜„

***๋ถ„ํ•  ์ •๋ณต์ด๋ž€?***

> ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ๋ฉด์„œ ํ•ด๊ฒฐํ•ด๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹


๋น ๋ฅธ ์ •๋ ฌ๋กœ ๋ถ„๋ฅ˜๋˜๋ฉฐ, ํ€ต์†ŒํŠธ์™€ ํ•จ๊ป˜ ๋งŽ์ด ์–ธ๊ธ‰๋˜๋Š” ์ •๋ ฌ ๋ฐฉ์‹์ด๋‹ค.



ํ€ต์†ŒํŠธ์™€๋Š” ๋ฐ˜๋Œ€๋กœ `์•ˆ์ • ์ •๋ ฌ`์— ์†ํ•จ

**์‹œ๊ฐ„๋ณต์žก๋„**

| ํ‰๊ท  | ์ตœ์„  | ์ตœ์•… |
| :------: | :------: | :------: |
| O(nlogn) | O(nlogn) | O(nlogn) |

์š”์†Œ๋ฅผ ์ชผ๊ฐ  ํ›„, ๋‹ค์‹œ ํ•ฉ๋ณ‘์‹œํ‚ค๋ฉด์„œ ์ •๋ ฌํ•ด๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ, ์ชผ๊ฐœ๋Š” ๋ฐฉ์‹์€ ํ€ต์ •๋ ฌ๊ณผ ์œ ์‚ฌ



- mergeSort

```
public void mergeSort(int[] array, int left, int right) {
if(left < right) {
int mid = (left + right) / 2;
mergeSort(array, left, mid);
mergeSort(array, mid+1, right);
merge(array, left, mid, right);
}
}
```

์ •๋ ฌ ๋กœ์ง์— ์žˆ์–ด์„œ merge() ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•ต์‹ฌ



*ํ€ต์†ŒํŠธ์™€์˜ ์ฐจ์ด์ *

> ํ€ต์ •๋ ฌ : ์šฐ์„  ํ”ผ๋ฒ—์„ ํ†ตํ•ด ์ •๋ ฌ(partition) โ†’ ์˜์—ญ์„ ์ชผ๊ฐฌ(quickSort)
>
> ํ•ฉ๋ณ‘์ •๋ ฌ : ์˜์—ญ์„ ์ชผ๊ฐค ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ชผ๊ฐฌ(mergeSort) โ†’ ์ •๋ ฌ(merge)


- merge()

```
public static void merge(int[] array, int left, int mid, int right) {
int[] L = Arrays.copyOfRange(array, left, mid + 1);
int[] R = Arrays.copyOfRange(array, mid + 1, right + 1);
int i = 0, j = 0, k = left;
int ll = L.length, rl = R.length;
while(i < ll && j < rl) {
if(L[i] <= R[j]) {
array[k] = L[i++];
}
else {
array[k] = R[j++];
}
k++;
}
// remain
while(i < ll) {
array[k++] = L[i++];
}
while(j < rl) {
array[k++] = R[j++];
}
}
```

์ด๋ฏธ **ํ•ฉ๋ณ‘์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ๋‘ ์˜์—ญ์ด ๊ฐ ์˜์—ญ์— ๋Œ€ํ•ด์„œ ์ •๋ ฌ์ด ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ**์— ๋‹จ์ˆœํžˆ ๋‘ ๋ฐฐ์—ด์„ **์ˆœ์ฐจ์ ์œผ๋กœ ๋น„๊ตํ•˜๋ฉด์„œ ์ •๋ ฌํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.**





**โ˜…โ˜…โ˜…ํ•ฉ๋ณ‘์ •๋ ฌ์€ ์ˆœ์ฐจ์ **์ธ ๋น„๊ต๋กœ ์ •๋ ฌ์„ ์ง„ํ–‰ํ•˜๋ฏ€๋กœ, **LinkedList์˜ ์ •๋ ฌ์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ํšจ์œจ์ **์ด๋‹ค.โ˜…โ˜…โ˜…



*LinkedList๋ฅผ ํ€ต์ •๋ ฌ์„ ์‚ฌ์šฉํ•ด ์ •๋ ฌํ•˜๋ฉด?*

> ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์Œ
>
> ํ€ต์ •๋ ฌ์€, ์ˆœ์ฐจ ์ ‘๊ทผ์ด ์•„๋‹Œ **์ž„์˜ ์ ‘๊ทผ์ด๊ธฐ ๋•Œ๋ฌธ**


**LinkedList๋Š” ์‚ฝ์ž…, ์‚ญ์ œ ์—ฐ์‚ฐ์—์„œ ์œ ์šฉ**ํ•˜์ง€๋งŒ **์ ‘๊ทผ ์—ฐ์‚ฐ์—์„œ๋Š” ๋น„ํšจ์œจ์ **์ž„

๋”ฐ๋ผ์„œ ์ž„์˜๋กœ ์ ‘๊ทผํ•˜๋Š” ํ€ต์†ŒํŠธ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐœ์ƒ์ด ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋จ

> ๋ฐฐ์—ด์€ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, LinkedList๋Š” Head๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•ด์•ผ ํ•จ
>
> ๋ฐฐ์—ด[O(1)] vs LinkedList[O(n)]




```
private void solve() {
int[] array = { 230, 10, 60, 550, 40, 220, 20 };
mergeSort(array, 0, array.length - 1);
for (int v : array) {
System.out.println(v);
}
}
public static void mergeSort(int[] array, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(array, left, mid);
mergeSort(array, mid + 1, right);
merge(array, left, mid, right);
}
}
public static void merge(int[] array, int left, int mid, int right) {
int[] L = Arrays.copyOfRange(array, left, mid + 1);
int[] R = Arrays.copyOfRange(array, mid + 1, right + 1);
int i = 0, j = 0, k = left;
int ll = L.length, rl = R.length;
while (i < ll && j < rl) {
if (L[i] <= R[j]) {
array[k] = L[i++];
} else {
array[k] = R[j++];
}
k++;
}
while (i < ll) {
array[k++] = L[i++];
}
while (j < rl) {
array[k++] = R[j++];
}
}
```

Loading

0 comments on commit e9f6955

Please sign in to comment.