排序之归并排序

来源:互联网 发布:win7公用网络无法点击 编辑:程序博客网 时间:2024/06/18 06:15


package sort;import java.util.Arrays;/** * Created by gch on 2017-08-15. */public class MergeSort {    public static void main(String[] args) {        int[] arr = {9,8,7,6,5,4,3,2,1};        mergeSortUncre(arr);//        mergeSort(arr,0,arr.length-1);        System.out.print(Arrays.toString(arr));    }    /**     * 递归 归并     * @param arr     */    private static void mergeSort(int[] arr,int left,int right){        if(arr == null || arr.length < 2 || left>=right){            return;        }        int mid = (left+right)/2;        mergeSort(arr,left,mid);        mergeSort(arr,mid+1,right);        merge(arr,left,mid,mid+1,right);    }    private static void merge(int[] arr,int leftStart,int leftEnd,int rightStart,int rightEnd ){        int[] tmp = new int[rightEnd-leftStart+1];        int i=leftStart,j=rightStart,k=0;        while(i<=leftEnd && j<=rightEnd){            if(arr[i]<=arr[j]){                tmp[k++] = arr[i];                i++;            }else{                tmp[k++] = arr[j];                j++;            }        }        while(i<=leftEnd){            tmp[k++] = arr[i++];        }        while(j<=rightEnd){            tmp[k++] = arr[j++];        }        for(k=0;k<tmp.length;k++){            arr[leftStart+k] = tmp[k];        }    }    /**     * 归并 非递归     * @param arr     */    public static void mergeSortUncre(int[] arr){        if(arr == null || arr.length <2){            return;        }        int len = arr.length;        for(int i=1;i<len;i*=2){            for(int j=0;j<=len-i-1;j+=i*2){                merge(arr,j,j+i-1,j+i,Math.min(j+2*i-1,len-1));            }        }    }}

原创粉丝点击