方式1:
package com.study.data.structures.sort;
import java.util.Arrays;
public class MergeSort {
private final static int THRESHOLD = 2;
public static int[] sort(int[] arr) {
if (arr.length < THRESHOLD) {
quickSort(arr, 0, arr.length - 1);
return arr;
} else {
int mid = (0 + arr.length) / 2;
int[] left = Arrays.copyOfRange(arr, 0, mid);
int[] right = Arrays.copyOfRange(arr, mid, arr.length);
return merge(sort(left), sort(right));
}
}
private static int[] merge(int[] left, int[] right) {
int[] result = new int[left.length + right.length];
for (int index = 0, leftIndex = 0, rightIndex = 0; index < result.length; index++) {
if (leftIndex >= left.length) {
result[index] = right[rightIndex++];
} else if (rightIndex >= right.length) {
result[index] = left[leftIndex++];
} else if (left[leftIndex] > right[rightIndex]) {
result[index] = right[rightIndex++];
} else {
result[index] = left[leftIndex++];
}
}
return result;
}
public static void quickSort(int[] arr, int left, int right) {
int l = left;
int r = right;
int middle = (left + right) / 2;
int middleValue = arr[middle];
int temp = 0;
while (l < r) {
while (arr[l] < middleValue) {
l += 1;
}
while (arr[r] > middleValue) {
r -= 1;
}
if (l >= r) {
break;
}
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
if (arr[l] == middleValue) {
l += 1;
}
if (arr[r] == middleValue) {
r -= 1;
}
}
if (l == r) {
l += 1;
r -= 1;
}
if (r > left) {
quickSort(arr, left, r);
}
if (l < right) {
quickSort(arr, l, right);
}
}
public static void main(String[] args) {
int[] arr = {9, 4, 6, 1, 5, 11};
int[] sort = sort(arr);
System.out.println(Arrays.toString(sort));
int[] arrays = new int[8000000];
for (int i = 0; i < 8000000; i++) {
arrays[i] = (int) (Math.random() * 8000000);
}
new Thread(() -> {
long start = System.currentTimeMillis();
sort(Arrays.copyOf(arrays, arrays.length));
long end = System.currentTimeMillis();
System.out.println("归并排序所花时间::" + (end - start));
}).start();
}
}
方式2:
package com.study.data.structures.sort;
import java.util.Arrays;
public class MergeSort2 {
private final static int THRESHOLD = 2;
private static void sort(int[] arr, int left, int right, int[] temp) {
if (left < right) {
int middle = (left + right) / 2;
sort(arr, left, middle, temp);
sort(arr, middle + 1, right, temp);
merge(arr, left, middle, right, temp);
}
}
private static void merge(int[] arr, int left, int middle, int right, int[] temp) {
int leftIndex = left;
int rightIndex = middle + 1;
int tempIndex = 0;
while (leftIndex <= middle && rightIndex <= right) {
if (arr[leftIndex] < arr[rightIndex]) {
temp[tempIndex++] = arr[leftIndex++];
} else {
temp[tempIndex++] = arr[rightIndex++];
}
}
while (leftIndex <= middle) {
temp[tempIndex++] = arr[leftIndex++];
}
while (rightIndex <= right) {
temp[tempIndex++] = arr[rightIndex++];
}
tempIndex = 0;
int tempLeft = left;
while (tempLeft <= right) {
arr[tempLeft++] = temp[tempIndex++];
}
}
public static void main(String[] args) {
int[] arr = {9, 4, 6, 1, 5, 11};
int[] temp = new int[arr.length];
sort(arr, 0, arr.length - 1, temp);
System.out.println(Arrays.toString(temp));
int[] arrays = new int[80000000];
for (int i = 0; i < 80000000; i++) {
arrays[i] = (int) (Math.random() * 80000000);
}
new Thread(() -> {
long start = System.currentTimeMillis();
int[] originArr = Arrays.copyOf(arrays, arrays.length);
int[] temp2 = new int[originArr.length];
sort(originArr, 0, originArr.length - 1, temp2);
long end = System.currentTimeMillis();
System.out.println("归并排序所花时间1::" + (end - start));
}).start();
new Thread(() -> {
long start = System.currentTimeMillis();
MergeSort.sort(Arrays.copyOf(arrays, arrays.length));
long end = System.currentTimeMillis();
System.out.println("归并排序所花时间2::" + (end - start));
}).start();
}
}