归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
如图先排粉色试它们之间有序后(粉色自身就是有序的),在它们有序后,再对绿色进行排序,然后有序后再队蓝色进行排序
public static void mergeSort(int[] array){
for(int i = 1;i < array.length;i = i*2){
merge(array,i);//分为1,2,4,6,8...进行排序合并
}
}
private static void merge(int[] array, int gap) {
// TODO Auto-generated method stub
int start1 = 0;//第一组的起始位置
int end1 = start1+gap-1;//第一组的结束位置
int start2 = end1+1;//第二组的起始位置
int end2 = start2+gap-1 < array.length-1 ? start2+gap-1 : array.length-1;//第二组的结束位置
int k = 0;
int[] tmpArr = new int[array.length];//用来存放排序过的元素
while(start2 < array.length){//将两组进行排序
while(start1 <= end1 && start2 <= end2){//
if(array[start1] < array[start2]){
tmpArr[k++] = array[start1++];
}else{
tmpArr[k++] = array[start2++];
}
}
while(start1 <= end1){
tmpArr[k++] = array[start1++];
}
while(start2 <= end2){
tmpArr[k++] = array[start2++];
}
//往后移,对另外两组进行排序
start1 = end2+1;
end1 = start1+gap-1;
start2 = end1+1;
end2 = start2+gap-1 < array.length-1 ? start2+gap-1 : array.length-1;
}
//当最后只有一组的时候
while(start1 < array.length){
tmpArr[k++] = array[start1++];
}
for(int j = 0;j < array.length;j++){
array[j] = tmpArr[j];
}
}