归并算法
1. 归并算法的思路
将想要排序的序列不断拆分,直至变为不能拆分的个体为止,将序列以对半分割的形式分成两段,再将其子序列再对半分割的形式分成两段。
时间复杂度为O(nlogn)。

拆分过后,再排序组合的时候,两两比较,选出两组数据的首位进行比较,依次比较,存入新的序列当中,以此类推,如图:
先比较3和4



在比较6和7

2,代码实现
package com.baidu.ueditor;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] arr = {8,4,5,7,1,3,6,2};
int[] newarr = new int[arr.length];
chaifen(arr , 0 , arr.length-1 , newarr);
}
//拆分序列,只需要拆分索引就可以
public static void chaifen(int[] arr , int left , int right ,int[] newarr){
//求中间的索引
int between = (left + right) / 2;
if(left < right) {
//右边的索引
chaifen(arr, left, between,newarr);
//左边的索引
chaifen(arr, (between + 1), right,newarr);
hebin(arr , left , between , right , newarr);
System.out.println(" 最左边索引:"+left+"\t最右边边索引:"+right+"\t"+ Arrays.toString(arr));
System.out.println("每次的排序结果"+Arrays.toString(arr));
}
}
public static void hebin(int[] arr , int left , int between , int right , int[] newarr){
int i = left; //初始i,左边有序序列的初始索引
int j = between+1; //初始j,右边有序序列的初始索引
int t = 0; //指向temp数组的当前索引
//1.
//先把左右两边(有序)的数据按照规则填充到temp数组
//直到左右两边的有序序列,有一边处理完毕为止
while(i <= between && j <= right) {
if(arr[i]<arr[j]) {
newarr[t]=arr[i];
i++;
}
else {
newarr[t]=arr[j++];
}
//因为无论执行if里面的语句还是else里面的语句,t都要加1,所以把t移出来.
t++;
}
//2.
//把有剩余数据的一边的的数据依次全部填充到temp,因为数据有可能出现单数的情况,剩下的单数都是最大的一个
//由上述循环条件:i<=mid&&j<=right 可知
//此时要么i>mid 要么j>right
while(i<=between) {
newarr[t]=arr[i];
t++;
i++;
}
while(j<=right) {
newarr[t]=arr[j];
t++;
j++;
}
//3.
//把temp的数组转移到arr上,实现每分隔一次,就组合一遍
int n=0;
int tempLeft=left;
while(tempLeft<=right){
arr[tempLeft]=newarr[n];
n++;
tempLeft++;
}
}
}

浙公网安备 33010602011771号