排序算法之归并排序

来源:互联网 发布:深圳网络出租屋办理 编辑:程序博客网 时间:2024/06/06 20:43

基本思想:分治策略

  1. 分解问题
  2. 解决问题
  3. 合并结果
public class MergeSort implements Sort{    //排序入口    @Override    public void sort(int[] unsorted) {        sort(unsorted,0,unsorted.length-1);    }    private void sort(int[] unsorted,int l,int r){        if (l < r){            //将待排数组划分成左右两个子数组            int m = (r+l)/2;            //处理左边子数组            sort(unsorted,l,m);            //处理右边子数组            sort(unsorted,m+1,r);            //至此,两个子数组已经是有序的,接着就是合并            merge(unsorted,l,m,r);        }    }     /***     * 辅助方法:合并两个有序数组     * [Al,Al+1,...Am] [Am+1,Am+2,...Ar]     * @param array 包含两个已排序数组     * @param l 左子数组的左边界     * @param m 左子数组的右边界     * @param r 右子数组的右边界     */    private void merge(int[] array,int l,int m,int r){        int[] temp = new int[r-l+1];        int i = l,j=m+1,k=0;        //两数组车轮战,依次比较        while (i<=m && j<=r){            if (array[i]<=array[j]) {                temp[k++] = array[i++];            }else {                temp[k++] = array[j++];            }        }        //一组已经全部排完,另一组还剩下部分数据,则无需比较直接按顺序紧接着临时数组后面        while(i <= m){            temp[k++] = array[i++];        }        while(j <= r){            temp[k++] = array[j++];        }        //将排好的数据拷贝回原数组        System.arraycopy(temp,0,array,l,temp.length);    }}
  • NOTE
    这里使用的是递归方法,好处是实现简单,但我们知道递归方法会保存函数调用栈帧,当栈深度超过限制会抛出StackOverflowError错误。因此要注意排序的数据量,或增大栈空间。除此之外,还可以改进算法,将递归转换成循环。