算法复习之归并排序

/** * 归并排序,分治思想的一种体现 * 事件复杂度:最好最坏都是O(nlogn),辅助空间是O(n) * @author Feng * */
public class MergeSorting {
    public static void sort(int[] src,int start,int end){
        if(start==end){
            return;
        }else{
            int middle = (start+end)/2;
            sort(src,start,middle);
            sort(src,middle+1,end);
            merge(src,start,middle,middle+1,end);
        }
    }
    /** * 区间[s1,e1],[s2,e2]已经排好序了,而且[s1,e2]是一段连续的空间 * @param src * @param s1 * @param e1 * @param s2 * @param e2 */
    public static void merge(int[] src, int s1, int e1, int s2, int e2) {
        int[] temp = new int[e2-s1+1];
        int ts1=s1,ts2=s2;//用来标记两个区间处理到哪一位置了
        for (int i = s1; i <=e2; i++) {
            if(ts1>e1){//说明第一段区间已经处理完
                temp[i-s1]=src[ts2++];
                continue;
            }
            if(ts2>e2){
                temp[i-s1]=src[ts1++];
                continue;
            }
            if(src[ts1]<=src[ts2]){
                temp[i-s1]=src[ts1++];
            }else{
                temp[i-s1]=src[ts2++];
            }
        }
        for (int i = s1; i <=e2; i++) {//赋值给原区间
            src[i]=temp[i-s1];
        }
    }
    public static void main(String[] args) {
        int[] src = new int[]{5,2,8,3,5,0};
        sort(src,0,src.length-1);
        for (int i : src) {
            System.out.println(i);
        }
    }
}

你可能感兴趣的:(归并排序)