归并排序算法采用分治法,将已有序的子集合并,以得到完全有序的集
一:创建归并后的集result,其length等同于待归并的两子集length之和
二:创建三个指针,分别指向result集,待归并集ints1,待归并集ints2初始位置
三:判断ints1[i]>ints2[j],将较小者存入result集中,同时将其指针与result集指针同时向后移动
四:重复此步骤,直到某一集的指针指向了末位,将另一集内剩余元素全部归并至result集
Java :
/**
* 归并排序
* @author Hector
*
*/
public class MergeSort {
/**
* 传入两个有序集,可以对两个有序集进行归并排序
* @param ints1
* @param ints2
* @return
*/
public static int[] mergeSort(int[] ints1,int[] ints2){
//创建结果集,等于待归并集之和
int[] result = new int[ints1.length+ints2.length];
//创建result集指针,初始指向首位
int resultIndex = 0;
//创建比较值
int ints1Index = 0;
int ints2Index = 0;
//为result结果集首位赋值
do{
//当待归并集1/待归并集2所使用指针指向末位,则退出算法
if(ints1Index>ints1.length-1||ints2Index>ints2.length-1){
//当待某归并集指针并未指向末尾时,证明该集并未完全归并,直接归并
if(ints1Index!=ints1.length){
System.arraycopy(ints1, ints1Index, result, resultIndex+1, ints1.length-ints1Index);
}
if(ints2Index!=ints1.length){
System.arraycopy(ints2, ints2Index, result, resultIndex+1, ints2.length-ints1Index);
}
break;
}
//判断待归并集,若集1指针所指位置比集2末位要大,则证明集1余下元素皆大于集2,直接归并
if(ints1[ints1Index]>ints2[ints2.length-1]){
System.arraycopy(ints1, ints1Index, result, resultIndex+1, ints1.length-ints1Index);
}
//判断待归并集,若集2指针所指位置比集1末位要大,则证明集2余下元素皆大于集1,直接归并
if(ints1[ints1Index]<ints2[ints2.length-1]){
System.arraycopy(ints2, ints2Index, result, resultIndex+1, ints2.length-ints2Index);
}
if(ints1[ints1Index]<ints2[ints2Index]){
result[resultIndex] = ints1[ints1Index];
ints1Index++;
}else{
result[resultIndex] = ints2[ints2Index];
ints2Index++;
}
resultIndex++;
//此条件可证明result结果集并未完全接受归并结果
}while(result[result.length-1]==0);
return result;
}
}