初始值数组[24,13,26,1,2,27,38,15]
思路:
1.先分成两个大小相同的子数组[24,13,26,1][2,27,38,35]
2.在划分 [24,13][26,1][2.27][38,35]
3.再划分[24][13][36][1][2][27][38][35]
此时有8个数组,每个数组可以视为有序的数组
代码实现
public class MergeTest {
public static void main(String[] args) {
int[] data = {4,13,26,1,2,27,38,15};
print(data);
//data是待排序的数组,左下标,最右侧下标
mergetsort(data,0,data.length-1);
System.out.println("排序后的数组");
print(data);
}
private static void mergetsort(int[] data, int left, int right) {
if (left>=right) return;//左下标大于右下标时退出
//找到拆分的中间的索引 7/2=3 前面4个数据
int center = (left+ right)/2;
//对左右进行递归调用
mergetsort(data,left,center);
mergetsort(data,center+1,right);
//合并,归并原理
merge(data,left,center,right);
}
/**
* data待排序的数组(子序列)
* left左侧数组的下标
* center 右侧数组左侧下标
* right 数组的最大下标
**/
private static void merge(int[] data, int ai, int center, int right) {
//临时数组
int[] tempArr = new int[data.length];
//右侧数组的第一个下表
int bi = center+1;
//临时数组的下标
int ti = ai;
//缓存数组的第一个元素的下标
int tmp = ai;
while (ai<=center && bi<=right){
if(data[ai]<=data[bi])
tempArr[ti++] = data[ai++];
else
tempArr[ti++] = data[bi++];
}
while (bi<= right)
tempArr[ti++] = data[bi++];
while (ai <= center)
tempArr[ti++] = data[ai++];
//不返回数据类型,将临时数组拷贝到原数组中
while (tmp<=right)
data[tmp] = tempArr[tmp++];
}
private static void print(int[] data){
for (int num :data){
System.out.print(num + " ");
}
System.out.println();
}
}
输出结果为:
4 13 26 1 2 27 38 15
排序后的数组
1 2 4 13 15 26 27 38