合并算法
public class QuickTest {
//递归分成小部分
public void merge_sort(int[] arrays,int start,int end){
//在索引0~9的数组中通过递归分成一下部分
//①第一次数组分割为两部分 0~4 5~9
//②第二次数组,两两分为四部分 0~2 3~4 5~7 8~9
//③第三次数组,两两分为四部分 0~1 2~2 3~4 5~6 7~7 8~9
if(start<end){
//先对0~1 5~6 进行小组排序,排序结果0~1、5~6小组中全为排序完成后的。
//第一次排序完成后再针对0~2(0~1已排序完毕,此小组再与2进行排序) 3~4 5~7(5~6已排序完毕,此小组与7进行排序) 8~9进行排序,
//第二次大排序后再针对0~4(0~2与3~4小组内已排序完成,两个小组间再进行排序) 5~9(5~7与8~9小组内已排序完成,两个小组间再进行排序)进行排序即可
int m=(start+end)/2;
merge_sort(arrays,start,m);
merge_sort(arrays,m+1,end);
//细分到小组后针对小组进行移位赋值操作
Merge2(arrays,start,m,end);
}
}
//打印数组
public void snp(int[] arrays){
for(int i=0;i<arrays.length;i++){
System.out.print(arrays[i]+" ");
}
System.out.println();
}
public static void main(String[] args)
{
QuickTest m=new QuickTest();
int a[]={2, 7, 8, 3, 1, 6, 9, 0, 5, 4};
m.snp(a);
m.merge_sort(a,0,a.length-1);
}
/**
* 针对分组后的小组进行移位赋值操作
* 在一次操作过程中,只变动当前所传的索引对应的小组内的移位排序,并不会影响除小组外的其他元素的位置,
* 当lo为5 mid为7 hi为9的时候,就说明只操作索引为5~9的元素,索引为0~4的元素位置并不会发生变化
* @param array
* @param lo
* @param mid
* @param hi
*/
private void Merge2(int[] array, int lo, int mid, int hi){
//lo 前组开始下标 mid 后组开始下标 hi 后组结束下标
//当前排序的内部组长度
int length = hi-lo+1;
//前组开始下标
int i=lo;
//后组参与比较的开始下标
int j=mid+1;
System.out.println("分组中部索引:"+mid);
//创建临时数组
int[] tempArrays = new int[length];
int k=0;
while(i<=mid && j<=hi){
//先将较小的数放在临时数组中 此过程必须保证开始下标不会大于结束下标
if(array[i]<array[j]){
tempArrays[k++]=array[i++];
}else{
tempArrays[k++]=array[j++];
}
}
//将右边的剩余的元素放在临时数组中
while(j<=hi){
tempArrays[k++]=array[j++];
}
//将左边的剩余的元素放在临时数组中
while(i<=mid){
tempArrays[k++]=array[i++];
}
for(int key = 0;key <length;key++){
array[key+lo]=tempArrays[key];
}
snp(array);
}
}