public class TmpTest {
@Test
public void test() throws Exception {
int[] arr = generateArray(10000000,10000000);
mergeSort(arr);
}
private void mergeSort(int[] arr) {
int[] tmp = new int[arr.length];
doMergeSort(arr, 0, arr.length - 1, tmp);
}
private void doMergeSort(int[] arr, int low, int high, int[] tmp) {
if (low >= high) return;
int mid = (low + high) / 2;
doMergeSort(arr, low, mid, tmp);
doMergeSort(arr, mid + 1, high, tmp);
sort(arr, low, high, tmp);
}
private void sort(int[] arr, int low, int high, int[] tmp) {
// copy原来数组到tmp
for (int i = low; i <= high; i++) {
tmp[i] = arr[i];
}
// 截成两段排序
int mid = (low + high) / 2;
int j = low;
int k = mid + 1;
for (int i = low; i <= high; i++) {
// 左边一段已经复制完
if (j > mid && k <= high) {
arr[i] = tmp[k++];
continue;
}
// 右边一段已经复制完
if (k > high && j <= mid) {
arr[i] = tmp[j++];
continue;
}
if (tmp[j] < tmp[k]) {
arr[i] = tmp[j++];
} else {
arr[i] = tmp[k++];
}
}
}
public static int[] generateArray(int size, int bound) {
Random random = new Random();
int[] arr = new int[size];
for (int i = 0; i < arr.length; i++) {
arr[i] = random.nextInt(bound);
}
return arr;
}
}
二路归并排序
最新推荐文章于 2022-07-15 15:57:48 发布