归并排序的定义
就是将两个或者两个以上有序表合并成一个行的有序表,原理是假设初始序列有n个记录,则可以看成有n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或者1的有序的子序列;再两两归并。。。重复直到得到一个长度为n的有序序列。
图解:
分析:
- 首先要注意的就是有序列表。
- 将两个列表合并起来。
合并两个列表的时候也要考虑以下问题:
- 在遍历的时候要考虑是否数组到达了最后一个位置。
思路:
- 将指针初始位置设置为两个有序列表的开头位置;
- 依次比较数组中的数据的大小;
- 直到某一个数组全部遍历将剩下有序列表中未遍历的数据一次存放在归并的数组数据的后面。
public class MergeTest {
public static void main(String[] args){
int[] a = {1,8,11,19,23};
int[] b = {3,4,7,12};
//将两个数组惊醒排序后得到新的数组
int[] c = merge(a,b);
//最后遍历c
for (int num:c){
System.out.print(num + " ");
}
}
private static int[] merge(int[] a, int[] b) {
//定义归并后的数组为tempArr
int[] tempArr = new int[a.length + b.length];
//数组的下表
int ai = 0;//数组a的下表
int bi = 0;//数组b的下标
int ti = 0;//数组temp数组的下标
//较小的值放入temoArr中
while (ai<a.length && bi<b.length) {//下标值小于数组的长度循环
if (a[ai] <= b[bi]) {
tempArr[ti++] = a[ai++];//先赋值然后下标移动到下一位置
} else {
tempArr[ti++] = b[bi++];
}
}
//如果某一个数组比较完毕则剩下的未比较的数组依次放入归并数组
while (ai<a.length){
tempArr[ti++] = a[ai++];
}
while (bi<b.length){
tempArr[ti++] = b[bi++];
}
return tempArr;
输出的结果为:1 3 4 7 8 11 12 19 23