归并排序采用分治法,其速度仅次于快速排序,且是一种稳定的排序算法。即相等的元素的顺序不会改变,如输入记录3(1),2(2),4(3),4(4),1(5),排序后得到,1(5),2(2),3(1),4(3),4(4),其中的4(3),4(4)就是输入时的顺序,因此对于某些数据要按输入时的顺序作为指标排序时,这相对于快速排序来说是优势。
对于数列(5,2,4,7,1,3,2,6),其排序过程如下:
初始状态:(5,2,4,7,1,3,2,6)
初次归并:(5,2)(4,7)(1,3)(2,6)
二次归并:(2,4,5,7)(1,2,3,6)
三次归并:(1,2,2,3,4,5,6,7}
如下:
public class MergeSortClass {
public static int[] mergeSort(int[] list){
if(list.length==1){
return list;
}
else{
int[] listL=new int[list.length/2];
int[] listR=new int[list.length-list.length/2];
int center=list.length/2;
for(int i=0;i<center;i++){
listL[i]=list[i];
}
for(int i=center,j=0;i<list.length;i++,j++){
listR[j]=list[i];
}
int[] sortedListL=mergeSort(listL);
int[] sortedListR=mergeSort(listR);
int[] o_list=mergeTwoSort(sortedListL,sortedListR);
return o_list;
}
}
public static int[] mergeTwoSort(int[] sortedListL,int[] sortedListR){
int i=0,j=0;
int[] o_list=new int[sortedListL.length+sortedListR.length];
int foot=0;
while(i<sortedListL.length && j<sortedListR.length){
if(sortedListL[i]<sortedListR[j]){
o_list[foot]=sortedListL[i];
i++;
}else{
o_list[foot]=sortedListR[j];
j++;
}
foot++;
}
if(i==sortedListL.length){
while(j<sortedListR.length){
o_list[foot++]=sortedListR[j++];
}
}else{
while(i<sortedListL.length){
o_list[foot++]=sortedListL[i++];
}
}
return o_list;
}
public static void outPut(int[] list){
for(int i=0;i<list.length;i++){
System.out.print(list[i]+" ");
}
}
public static void main(String[] args){
int[] list={5,2,4,7,1,3,2,6};
int [] list1=mergeSort(list);
outPut(list1);
}
}
新版Qt可以支持Android和IOS平台,布布扣,bubuko.com
原文:http://blog.csdn.net/xgbing/article/details/21008439