์ด์ ํฌ์คํธ์์ ํฉ๋ณ ์ ๋ ฌ์ ๋ํด์ ์์๋ณด์๋ค.
์ด๋ฒ์๋ ํต ์ ๋ ฌ์ ์์๋ณด๋ฉด์ ํฉ๋ณ ์ ๋ ฌ๊ณผ ์ฐจ์ด์ ์ ์์๋ณด์.
ํฉ๋ณ ์ ๋ ฌ์๋ํ ์ค๋ช ์ ์๋ตํ๋ค.
public class Main {
public static void main(String[] args) {
// list ์ด๊ธฐํ (10๋ง ๊ฐ์ ์์)
int[] list = new int[100000];
Random random = new Random();
for (int i = 0; i < list.length; i++) {
list[i] = Math.abs(random.nextInt()); // ์์๊ฐ ์๋ ๊ฐ ์์ฑ
}
quickSortTest(list);
}
private static void quickSortTest(int[] list) {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:ms");
QuickSort quickSort = new QuickSort();
Date now = new Date();
String start = sdf1.format(now);
quickSort.quickSort(list);
Date now2 = new Date();
String end = sdf1.format(now2);
System.out.println("์์์๊ฐ quickSort : " + start);
System.out.println("์ข
๋ฃ์๊ฐ quickSort : " + end);
System.out.println("quickSort ๊ฑธ๋ฆฐ ์๊ฐ : " + (now2.getTime() - now.getTime()) / 1000.0 + "์ด");
System.out.println();
}
}
class QuickSort {
public void quickSort(int[] arr) {
quickSort(arr, 0, arr.length - 1);
}
private void quickSort(int[] arr, int start, int end) {
int part2 = partition(arr, start, end);
if (start < part2 - 1) {
quickSort(arr, start, part2 - 1);
}
if (part2 < end) {
quickSort(arr, part2, end);
}
}
private int partition(int[] arr, int start, int end) {
int pivot = arr[(start + end) / 2];
while (start <= end) {
while (arr[start] < pivot) start++;
while (arr[end] > pivot) end--;
if (start <= end) {
swap(arr, start, end);
start++;
end--;
}
}
return start;
}
private void swap(int[] arr, int start, int end) {
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
}
public class Main {
public static void main(String[] args) {
int size = 100000;
int[] list = new int[size];
Random random = new Random();
for (int i = 0; i < list.length; i++) {
list[i] = Math.abs(random.nextInt());
}
quickSortTest(list);
int[] list2 = new int[size];
Random random2 = new Random();
for (int i = 0; i < list.length; i++) {
list2[i] = Math.abs(random2.nextInt());
}
ArraySortTest(list2);
int[] list3 = new int[size];
Random random3 = new Random();
for (int i = 0; i < list3.length; i++) {
list3[i] = Math.abs(random3.nextInt());
}
mergeSortTest(list3);
}
private static void quickSortTest(int[] list) {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:ms");
QuickSort quickSort = new QuickSort();
Date now = new Date();
String start = sdf1.format(now);
quickSort.quickSort(list);
Date now2 = new Date();
String end = sdf1.format(now2);
System.out.println("์์์๊ฐ quickSort : " + start);
System.out.println("์ข
๋ฃ์๊ฐ quickSort : " + end);
System.out.println("quickSort ๊ฑธ๋ฆฐ ์๊ฐ : " + (now2.getTime() - now.getTime()) / 1000.0 + "์ด");
System.out.println();
}
private static void mergeSortTest(int[] list) {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:ms");
MergeSort mergeSort = new MergeSort();
Date now = new Date();
String start = sdf1.format(now);
mergeSort.solution(list);
Date now2 = new Date();
String end = sdf1.format(now2);
System.out.println("mergeSort ์์์๊ฐ : " + start);
System.out.println("mergeSort ์ข
๋ฃ์๊ฐ : " + end);
System.out.println("mergeSort ๊ฑธ๋ฆฐ ์๊ฐ : " + (now2.getTime() - now.getTime()) / 1000.0 + "์ด");
System.out.println();
}
private static void ArraySortTest(int[] list) {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:ms");
Date now = new Date();
String start = sdf1.format(now);
Arrays.sort(list);
Date now2 = new Date();
String end = sdf1.format(now2);
System.out.println("ArraySort ์์์๊ฐ : " + start);
System.out.println("ArraySort ์ข
๋ฃ์๊ฐ : " + end);
System.out.println("ArraySort ๊ฑธ๋ฆฐ ์๊ฐ : " + (now2.getTime() - now.getTime()) / 1000.0 + "์ด");
System.out.println();
}
}
class MergeSort {
public int[] solution(int[] numList) {
int size = numList.length - 1;
mergeSort(numList, 0, size);
return numList;
}
void mergeSort(int[] numList, int left, int right) {
int mid = 0;
if (left < right) {
// (left+right)/2 ์ค๋ฒํ๋ก์ฐ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ
mid = left + (right - left) / 2;
mergeSort(numList, left, mid);
mergeSort(numList, mid + 1, right);
merge(numList, left, mid, right);
}
}
void merge(int[] list, int left, int mid, int right) {
int[] sorted = new int[list.length];
int i, j, k, l;
i = left;
j = mid + 1;
k = left;
/* ๋ถํ ์ ๋ ฌ๋ list์ ํฉ๋ณ */
while (i <= mid && j <= right) {
if (list[i] <= list[j])
sorted[k++] = list[i++];
else
sorted[k++] = list[j++];
}
// ๋จ์ ์๋ ๊ฐ๋ค์ ์ผ๊ด ๋ณต์ฌ
if (i > mid) {
for (l = j; l <= right; l++)
sorted[k++] = list[l];
}
// ๋จ์ ์๋ ๊ฐ๋ค์ ์ผ๊ด ๋ณต์ฌ
else {
for (l = i; l <= mid; l++)
sorted[k++] = list[l];
}
// ๋ฐฐ์ด sorted[](์์ ๋ฐฐ์ด)์ ๋ฆฌ์คํธ๋ฅผ ๋ฐฐ์ด list[]๋ก ์ฌ๋ณต์ฌ
for (l = left; l <= right; l++)
System.arraycopy(sorted, left, list, left, right - left + 1);
}
}
class QuickSort {
public void quickSort(int[] arr) {
quickSort(arr, 0, arr.length - 1);
}
private void quickSort(int[] arr, int start, int end) {
int part2 = partition(arr, start, end);
if (start < part2 - 1) {
quickSort(arr, start, part2 - 1);
}
if (part2 < end) {
quickSort(arr, part2, end);
}
}
private int partition(int[] arr, int start, int end) {
int pivot = arr[(start + end) / 2];
while (start <= end) {
while (arr[start] < pivot) start++;
while (arr[end] > pivot) end--;
if (start <= end) {
swap(arr, start, end);
start++;
end--;
}
}
return start;
}
private void swap(int[] arr, int start, int end) {
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
}
์ถ์ฒ : https://www.youtube.com/watch?v=7BDzle2n47c - [์๋ฃ๊ตฌ์กฐ ์๊ณ ๋ฆฌ์ฆ] ํต์ ๋ ฌ(Quicksort)์ ๋ํด ์์๋ณด๊ณ ์๋ฐ๋ก ๊ตฌํํ๊ธฐ - ์์ง๋์ด ๋ํ๋ฏผ๊ตญ
์ถ์ฒ : https://gmlwjd9405.github.io/2018/05/10/algorithm-quick-sort.html - [์๊ณ ๋ฆฌ์ฆ] ํต ์ ๋ ฌ(quick sort)์ด๋