一、归并的思想
是分治算法的完美体现
步骤一:拆解算法
a.找出分解点,在此处是是中间点拆分,拆成左右俩个数组。
b.左、右俩个数组采用同样的方式拆解,一直循环拆,直到拆到一个元素为止(因为一个元素本身就是有序的特性),
步骤二:合并算法(利用俩个有序的数组比较简单合并的思路,进行合并)
二、代码展示
package com.yan.algorithm.devide;
public class Merge {
/**
* 合并算法,调用的前提条件是:
* 1.下标low -> mid 有序
* 2.下标 mid + 1 -> high 有序
*/
public static void mergeSort(int[] a, int low, int mid, int high) {
int i = low, j = mid + 1;// 俩个子数组的活动游标
int[] b = new int[high - low + 1];// 辅助数组
int k = 0;// 辅助数组下标
while (i <= mid && j <= high) {// 将小的元素放入辅助数组
if (a[i] <= a[j]) {
b[k++] = a[i++];
}
if (a[i] > a[j]) {
b[k++] = a[j++];
}
}
while (i <= mid) {//将左边数组中剩余的 i->mid 中的数据放入辅助数组
b[k++] = a[i++];
}
while (j <= high) {//将右边数组中剩余的 j->high 中的数据放入辅助数组
b[k++] = a[j++];
}
for(int m = 0; m < b.length; m++) {
a[low + m] = b[m];
}
}
//拆分,调用合并算法
public static void merge(int[] a, int low, int high) {
if(low == high) {//一个元素是有序的,不需要排序
return ;
}
int mid = (low + high) / 2;
merge(a, low, mid);
merge(a, mid + 1, high);
mergeSort(a, low, mid, high);
}
public static void main(String[] args) {
int[] a = {5, 2, 50, 1, 29, 45, 35};
merge(a, 0, a.length - 1);
for(int t : a) {
System.out.println(t);
}
}
}