Skip to content

Commit b015594

Browse files
authored
Merge pull request #37 from Data-Structure-Study/yoonexample
복잡한 정렬 알고리즘 완료
2 parents 4be86de + a5bb630 commit b015594

File tree

3 files changed

+116
-0
lines changed

3 files changed

+116
-0
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package sort;
2+
3+
import heap.ArrayUsefulHeap;
4+
import heap.UsefulHeap;
5+
import java.util.Comparator;
6+
7+
public class HeapSort implements Sort {
8+
9+
@Override
10+
public void sort(int[] array) {
11+
this.sort(array, ((o1, o2) -> o2 - o1));
12+
}
13+
14+
private void sort(int[] array, Comparator<Integer> comp) {
15+
UsefulHeap<Integer> heap = new ArrayUsefulHeap<>(comp);
16+
17+
// 정렬 대상을 가지고 힙을 구성한다.
18+
for (int i : array) {
19+
heap.insert(i);
20+
}
21+
22+
// 힙에서 하나씩 꺼내서 정렬된 구조로 반환한다.
23+
for (int i = 0; i < array.length; i++) {
24+
array[i] = heap.delete();
25+
}
26+
}
27+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package sort;
2+
3+
public class MergeSort implements Sort {
4+
5+
@Override
6+
public void sort(int[] array) {
7+
mergeSort(array, 0, array.length - 1);
8+
}
9+
10+
private void mergeSort(int[] array, int left, int right) {
11+
if (left < right) { // 더 나눌 수 있다면
12+
int mid = left + ((right - left) / 2); // https://endorphin0710.tistory.com/112 참조
13+
14+
mergeSort(array, left, mid);
15+
mergeSort(array, mid + 1, right);
16+
17+
mergeTwoArea(array, left, mid, right);
18+
}
19+
}
20+
21+
private void mergeTwoArea(int[] array, int left, int mid, int right) {
22+
int[] temp = new int[right + 1];
23+
int fIndex = left;
24+
int rIndex = mid + 1;
25+
int sIndex = left;
26+
27+
while (fIndex <= mid && rIndex <= right) {
28+
if (array[fIndex] <= array[rIndex]) {
29+
temp[sIndex] = array[fIndex++];
30+
} else {
31+
temp[sIndex] = array[rIndex++];
32+
}
33+
34+
sIndex++;
35+
}
36+
37+
if (fIndex > mid) {
38+
for (int i = rIndex; i <= right; i++, sIndex++) {
39+
temp[sIndex] = array[i];
40+
}
41+
} else {
42+
for (int i = fIndex; i <= mid; i++, sIndex++) {
43+
temp[sIndex] = array[i];
44+
}
45+
}
46+
47+
for (int i = left; i <= right; i++) {
48+
array[i] = temp[i];
49+
}
50+
}
51+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package sort;
2+
3+
public class QuickSort implements Sort {
4+
5+
@Override
6+
public void sort(int[] array) {
7+
quickSort(array, 0, array.length - 1);
8+
}
9+
10+
private void quickSort(int[] array, int left, int right) {
11+
if (left < right) { // 교차되기 전까지
12+
int pivot = partition(array, left, right);
13+
quickSort(array, left, pivot - 1);
14+
quickSort(array, pivot + 1, right);
15+
}
16+
}
17+
18+
private int partition(int[] array, int left, int right) {
19+
int pivot = array[left];
20+
int k = right;
21+
22+
for (int i = right; i > left; i--) {
23+
if (array[i] > pivot) {
24+
swap(array, i, k);
25+
k--;
26+
}
27+
}
28+
29+
swap(array, left, k);
30+
return k;
31+
}
32+
33+
private void swap(int[] array, int index1, int index2) {
34+
int temp = array[index1];
35+
array[index1] = array[index2];
36+
array[index2] = temp;
37+
}
38+
}

0 commit comments

Comments
 (0)