排序-归并排序-优化(插入排序+复制采用System.arraycopy)

来源:互联网 发布:php开源投票系统 编辑:程序博客网 时间:2024/05/16 19:20
package xwq.sort;import xwq.util.StdIn;import xwq.util.StdOut;/** * 优化后的归并排序 * 使用插入排序优化 * copy操作由原来的循环复制改为使用 * java API:System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length) */public class MergeSortX {    private static int CUTOFF = 10;//插入排序临界值    public static void sort(Comparable[] a) {        Comparable[] acopy = new Comparable[a.length];        sort(a,acopy,0,a.length-1);    }    private static void sort(Comparable[] a,Comparable[] acopy,int low,int high) {        if(low >= high) return;        //插入排序优化        if((high-low+1) <= CUTOFF) {            insertSort(a,low,high);            return;        }        int mid = (low+high)/2;        sort(a,acopy,low,mid);        sort(a,acopy,mid+1,high);        merge(a,acopy,low,mid,high);    }    //合并两个已经递增有序的数组a[low,mid],a[low+1,high]    private static void merge(Comparable[] a,Comparable[] acopy,int low,int mid,int high) {        //for(int i = low;i<=high;i++)         //  acopy[i] = a[i];        //copy待排序部分数组到辅助数组        //System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length)        //使用System.arraycopy快于使用循环复制        System.arraycopy(a, low, acopy, low, high-low+1);        //左半待合并数组a[low,mid],右半待合并数组a[low+1,high]        int i = low; //待合并左半部分数组起点位置        int j = mid+1;//待合并右半部分数组起点位置        int k = low; //合并数组起点位置        while(k<=high) {            //左半数组已全部插入            if(i>mid) a[k++] = acopy[j++];             //右半数组已全部插入            else if(j>high)  a[k++] = acopy[i++];            //左半数组目前所指向的元素值<右半数组所指向的元素值            else if(less(acopy[i],acopy[j])) a[k++] = acopy[i++];            //左半数组目前所指向的元素值>=右半数组所指向的元素值            else a[k++] = acopy[j++];        }    }    //插入排序    private static void insertSort(Comparable[] a,int low, int high) {        for(int i = low+1;i<=high;i++) {            Comparable insert = a[i];            int pos = i-1;            while(pos>=low && less(insert,a[pos])) {                a[pos+1] = a[pos];                pos--;            }            a[pos+1] = insert;        }    }    //v<w    private static boolean less(Comparable v,Comparable w) {        return v.compareTo(w) < 0;    }    //输出排序数组    public static void print(Comparable a[]) {        for(int i = 0;i<a.length;i++)            StdOut.print(a[i]+" ");    }    //测试函数    public static void main(String[] args) {            String[] a = StdIn.readAllStrings();        sort(a);        print(a);    }}
0 0