归并排序--Java

来源:互联网 发布:数据库的算法 编辑:程序博客网 时间:2024/05/01 21:50

归并排序采用分治法,其速度仅次于快速排序,且是一种稳定的排序算法。即相等的元素的顺序不会改变,如输入记录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);}}


0 0
原创粉丝点击