/*
归并排序
思路:各大博客都有,只提供代码分析
*/
public static int[] mergSort(int[] array) {
if (array.length <= 2) { //当递归到最后面的数组长度小于等于二的时候,说明已经到最后了,现在的数组是分割
for (int i = 0; i < array.length; i++) { //后最小的数组,然后把这个数组内部经行排序,然后返回
for (int j = 0; j < array.length - 1 - i; j++) {
if (array[j] > array[j + 1]) {
int tem = array[j];
array[j] = array[j + 1];
array[j + 1] = tem;
}
}
}
return array;
}
int middle = (0 + array.length) / 2; //获取最中间的点
int array1[] = mergSort(Arrays.copyOf(array, middle + 1)); //递归获取分割后左边的数组
int array2[] = mergSort(Arrays.copyOfRange(array, middle + 1, array.length));//递归获取分割后右边的数组
int array3[] = sort(array1, array2); //对两个数组经行排序
return array3;
}
public static int[] sort(int a1[], int a2[]) { //将已经经行过内部排序的两个数组再放在一起经行排序
int arrar[] = new int[a1.length + a2.length]; //新建一个数组长度等于两个数组长度和,用来存放排序好的数字
int i = 0; //用来定位数组a1的当前元素索引
int j = 0; //用来定位数组a2的当前元素索引
int k = 0; //用来定位新建数组的当前元素索引
while (i < a1.length && j < a2.length) { //如果a1和a2当前元素都没有比较完则继续比较
if (a1[i] < a2[j]) { //a1的元素比a2小,则把a1的数放到新建的数组中同时a1和新建数组下标索引都+1,然后进行下一轮比较
arrar[k] = a1[i];
i++;
k++;
} else {
arrar[k] = a2[j]; //a2的元素比a1小,则把a1的数放到新建的数组中同时a2和新建数组下标索引都+1,然后进行下一轮比较
j++;
k++;
}
}
if (i == a1.length) { //当a1中的数都比较完,因为a2数组元素是有序的,已近排列好的,所以将a2剩余元素放到新建数组中
for (int l = j; l < a2.length; l++) {
arrar[k] = a2[l];
k++;
}
}
if (j == a2.length) {
for (int l = i; l < a1.length; l++) { //当a2中的数都比较完,因为a1数组元素是有序的,已近排列好的,所以将a1剩余元素放到新建数组中
arrar[k] = a1[l];
k++;
}
}
return arrar; //返回的数组是已尽排序好的
}
归并排序
最新推荐文章于 2022-03-18 20:03:55 发布