《java hebing排序算法》

合并算法

public class QuickTest {
     //递归分成小部分
    public void merge_sort(int[] arrays,int start,int end){
        //在索引0~9的数组中通过递归分成一下部分
        //①第一次数组分割为两部分                     0~4                        5~9
        //②第二次数组,两两分为四部分      0~2       3~4            5~7       8~9
        //③第三次数组,两两分为四部分  0~1   2~2     3~4       5~6    7~7     8~9
        if(start<end){
            //先对0~1       5~6 进行小组排序,排序结果0~1、5~6小组中全为排序完成后的。
            //第一次排序完成后再针对0~2(0~1已排序完毕,此小组再与2进行排序) 3~4     5~7(5~6已排序完毕,此小组与7进行排序) 8~9进行排序,
            //第二次大排序后再针对0~4(0~2与3~4小组内已排序完成,两个小组间再进行排序) 5~9(5~7与8~9小组内已排序完成,两个小组间再进行排序)进行排序即可
            int m=(start+end)/2;
            merge_sort(arrays,start,m);
            merge_sort(arrays,m+1,end);
            //细分到小组后针对小组进行移位赋值操作
            Merge2(arrays,start,m,end);   
        }
    }
    //打印数组
    public void snp(int[] arrays){
        for(int i=0;i<arrays.length;i++){
        System.out.print(arrays[i]+" ");
        }
        System.out.println();
    }    
   
    public static void main(String[] args)
    {
        QuickTest m=new QuickTest();
        int a[]={2, 7, 8, 3, 1, 6, 9, 0, 5, 4};
        m.snp(a);
        m.merge_sort(a,0,a.length-1);
       
    }
    /**
     * 针对分组后的小组进行移位赋值操作
     * 在一次操作过程中,只变动当前所传的索引对应的小组内的移位排序,并不会影响除小组外的其他元素的位置,
     * 当lo为5 mid为7 hi为9的时候,就说明只操作索引为5~9的元素,索引为0~4的元素位置并不会发生变化
     * @param array
     * @param lo
     * @param mid
     * @param hi
     */
    private  void Merge2(int[] array, int lo, int mid, int hi){
        //lo   前组开始下标   mid  后组开始下标   hi   后组结束下标
        //当前排序的内部组长度
        int length = hi-lo+1;
        //前组开始下标
        int i=lo;
        //后组参与比较的开始下标
        int j=mid+1;
        System.out.println("分组中部索引:"+mid);
        //创建临时数组
        int[] tempArrays = new int[length];
        int k=0;
        while(i<=mid && j<=hi){
            //先将较小的数放在临时数组中   此过程必须保证开始下标不会大于结束下标
            if(array[i]<array[j]){
                tempArrays[k++]=array[i++];
            }else{
                tempArrays[k++]=array[j++];
            }
        }
        //将右边的剩余的元素放在临时数组中   
        while(j<=hi){
            tempArrays[k++]=array[j++];
        }
        //将左边的剩余的元素放在临时数组中
        while(i<=mid){
            tempArrays[k++]=array[i++];
        }
       
        for(int key = 0;key <length;key++){
            array[key+lo]=tempArrays[key];
        }
        snp(array);
    }
   
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值