归并排序--java 实现

归并排序


      归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列.

**步骤**
      比较array[i]和array[j]的大小,若array[i]≤array[j],则将第一个有序表中的元素array[i]复制到num[k]中,并令i和k分别加上1;否则将第二个有序表中的元素array[j]复制到num[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到num中。归并排序的算法我们通常用递归实现,先把待排序区间[low,high]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[low,high]。
public class TestDemo2Gb{
    public static void main(String[] args) {
           int []array ={1,5,8,2,3,9,0,7};
           sortDg(array,0,array.length-1);
            for(int tem :array){       //遍历数组
            System.out.println(tem);
        }
    }
    public static void mergSort(int []array,int low,int mid,int high){
        int i = low;//左边起始指针
        int j = mid+1;//右边其实指针
        int k = low;
        int []num = new int[array.length];//辅助数组
        while(i <=mid && j <= high) {
            if(array[i] <array[j])    //左右起始指针指向的位置的元素进行比较,小的放入辅助数组中
            {
                 num[k++] = array[i++];
            }
            if(array[i]>array[j])
            {
                num[k++] = array[j++];
            }
        }
            while(i<=mid){               //如果到最后左边索引未走到末尾,把剩下索引对应的元素加到辅助数组中。
                num[k++]=array[i++];
            }
            while(j<=high){            //如果到最后右边索引未走到末尾,把剩下索引对应的元素加到辅助数组中。
                num[k++]=array[j++];
            }
            for(int s=low;s<=high;s++){   //把数组中的元素放到原数组中。
                array[s]=num[s];
            }
    }
    public static void sortDg(int []array,int low,int high){
           if(low<high) {
               int mid = (low + high)/2;
               sortDg(array, low, mid);//左边递归排序
               sortDg(array, mid + 1, high);//右边递归排序
               mergSort(array, low, mid, high);//左右归并
           }
    }
}
0
1
2
3
5
7
8
9
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值