归并排序是一个对递归和分治很好诠释的一个排序算法
它是将一个无序的数组依次分开使之变为有序的数组,如果我们一直将其分解到一个数组中只有一个数,那么我们就可以理解为他是有序的,然后再将这些有序的数组依次合并成一个数组,至于如何合并就很简单了,我们只需要比较第一个数字,哪个数组的数字大就选取哪个数组的,然后把第一个数字拿到新的数组中,然后删除原数组中的值,依次比较,如果其中一个数组空了,那么我们就将另一个数组全部拿到新数组中,这样我们就可以得到一个有序的新数组,依次合并最终完成排序,举一个例子就很好理解。
(23,12,5,76,32,87,34,11)这里他是一个无序的数组,我们先把他进行分解
(23,12,5,76)(32,87,34,11)--->(23,12) (5,76)(32,87) (34,11)
(23)(12)(5)(76)(32)(87)(34)(11)此时出现的8个数组都可以视为有序的
然后依次进行合并
(12,23)(5,76)(32,87)(11,34)-->(5,12,23,76)(11,32,34,87)
最终变为(5,11,12,23,32,34,76,87)完成排序
代码如下
public class MergeSort {
public static void merge(int[] a, int low, int mid, int high) {
int i = low;// 定义左指针
int j = mid + 1;// 定义右指针
int k = 0;
int[] temp = new int[high - low + 1];
while (i <= mid && j <= high) {
if (a[i] < a[j]) {
temp[k++] = a[i++];
}
else {
temp[k++] = a[j++];
}
} // 把左边剩余的数移入数组
while (i <= mid) {
temp[k++] = a[i++];
} // 把右边边剩余的数移入数组
while (j <= high) {
temp[k++] = a[j++];
} // 把新数组中的数覆盖nums数组
for (int k2 = 0; k2 < temp.length; k2++) {
a[k2 + low] = temp[k2];
}
}
public static void mergeSort(int[] a, int low, int high) {
int mid = (low + high) / 2;
if (low < high) {
// 对左边进行分解 mergeSort(a, low, mid);
// 对右边进行分解 mergeSort(a, mid + 1, high);
// 左右进行归并 merge(a, low, mid, high);
System.out.println(Arrays.toString(a));
}
}
public static void main(String[] args) {
int a[] = { 23,12,5,76,32,87,34,11};
mergeSort(a, 0, a.length - 1);
System.out.println("排序结果:" + Arrays.toString(a)); }
}