归并排序

来源:互联网 发布:淘宝直通车推广费钱吗 编辑:程序博客网 时间:2024/06/18 13:57
package lsn1.sjjg.cct.cn.lsn1;import org.junit.Test;/** * 归并排序 适合链表性数据 * Created by linyaokui on 17/12/4. */public class MergeSort {    @Test    public void testMerge(){        int[] array=new int[]{1,3,5,7,9,4,8,10};        mergeSort(array,0,array.length-1);        for(int i=0;i<array.length;i++){            System.out.print(array[i]+" ");        }    }    //归并排序    public static void mergeSort(int array[],int left,int right){        if(left==right){            return;        }else{            int mid=(left+right)/2;            mergeSort(array,left,mid);//排好左边  L            mergeSort(array,mid+1,right);//排好右边  R            merge(array,left,mid+1,right);//再对左右进行合并 D        }    }    //归并排序    0    4    7    public static void merge(int[] array,int left,int mid,int right){        int leftSize=mid-left;        int rightSize=right-mid+1;        //生成数组        int[] leftArray=new int[leftSize];        int[] rightArray=new int[rightSize];        //填充左边的数组        for(int i=left;i<mid;i++){            leftArray[i-left]=array[i];        }        //填充右边的数组        for(int i=mid;i<=right;i++){            rightArray[i-mid]=array[i];        }        //合并数组        int i=0;        int j=0;        int k=left;        while(i<leftSize && j<rightSize){            if(leftArray[i]<rightArray[j]){                array[k++]=leftArray[i++];            }else{                array[k++]=rightArray[j++];            }        }        while(i<leftSize){//左边还有数据没用完            array[k++]=leftArray[i++];        }        while(j<rightSize){//右边还有数据没用完            array[k++]=rightArray[j++];        }    }}