import java.util.Arrays;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
/**
* 并归排序
*/
public class MergeSort {
/**
* 并归排序
* @param array
* @param left
* @param right
*/
public static void sort(int[] array, int left, int right) {
if (left < right) {
// 数组均分为两段
int middle = (left + right)/ 2;
// 左数组并归排序
sort(array, left, middle);
// 右数组并归排序
sort(array, middle + 1, right);
// 合并左右数组
merge(array, left, middle, right);
}
}
/**
* 合并数组
* @param array
* @param left
* @param middle
* @param right
*/
public static void merge(int[] array, int left, int middle, int right) {
int i = left, j = middle + 1, t = 0;
int[] tempArray = new int[array.length];
while (i <= middle && j <= right) {
int value;
// 从左到右依次比较左右数组的值,将值小的复制到临时数组中,并移动指针
if (array[i] < array[j]) {
value = array[i++];
} else {
value = array[j++];
}
tempArray[t++] = value;
}
// 将左数组剩余的数据拷贝到临时数组
while (i <= middle) {
tempArray[t++] = array[i++];
}
// 将右数组剩余的数据拷贝到临时数组
while (j <= right) {
tempArray[t++] = array[j++];
}
// 将临时数组的内容拷贝到原数组中
i = left; t = 0;
while (i <= right) {
array[i++] = tempArray[t++];
}
}
public static void main(String[] args) {
int length = 10;
int[] array = generateArray(length);
System.out.println("Original: " + Arrays.toString(array));
sort(array, 0, array.length - 1);
System.out.println("After Sort: " + Arrays.toString(array));
}
/**
* 生成随机数组
* @param length
* @return
*/
private static int[] generateArray(int length) {
Random random = new Random(31);
int[] array = new int[length];
Set<Integer> set = new HashSet<>(length);
for (int i = 0; i < length; i++) {
int value;
do {
value = random.nextInt(length);
} while (set.contains(value));
array[i] = value;
set.add(value);
}
return array;
}
}
排序 - 并归排序
最新推荐文章于 2022-10-19 12:10:02 发布