JAVA十大排序中的-(归并排序)

前奏
该算法是采用分治法的典型应用,将一个无序序列分组诺干个,然后对该小组进行排序,排序完以后,将各个小组合并排序比较,直到将诺干个小组组合成一组就是一个有序列表了
思路 提示:使用了回溯思想、拆到不能再拆的时候才进行排序比较
1:将一个无序列表依次的回调拆分成诺干个小组(提示:小组里面的元素可以是一个最多是2)先将左边的进行拆分合并排序,在执行右边的拆分排序
2:然后无法回调的时候就将当前小组内容进行合并排序,然后返回到拆分为当前层的层栈上进行合并排序,依次类推
提示:需要在创建一个同大小的数组 该数组是用来进行临时排序存储合并用的  所谓的空间换时间
课外仅供参考
如果与一组8000个数据的数组排序的情况下             时间差不多3毫秒不到 
如果与一组80000个数据的数组排序的情况下            时间差不多30毫秒不到
如果与一组800000个数据的数组排序的情况下           时间差不多150毫秒不到
如果与一组8000000个数据的数组排序的情况下          时间差不多1.3秒不到
如果与一组80000000个数据的数组排序的情况下         时间差不多15秒不到
归并是先使劲的递归递归到不能在递归才进行排序合并、而且快速排序排序一次在进行递归
图解 1

在这里插入图片描述

图解2在这里插入图片描述
代码

注意:这里的count对应的索引值是当前区域的left ,然后将当前内容赋值给temp也是对应当前count索引
提示:如果将从小到大顺序变成从大到小顺序,改对应的将> 改成<

//归并排序方法
public class MergeSortDemo {
    public static void main(String[] args) {

        int [] arr={123,1,412,3,12,1,23,12,3,1,23,123,12,3123,12,3,123};
        MergeSort.mergeSort(arr,0,arr.length-1,new int[arr.length]);
        System.out.println(Arrays.toString(arr));
    }
}

class MergeSort{

    public static void mergeSort(int orderByArrat[],int left,int right,int tempArray[]){

        if(right<=left)return;

        //获取中间值
        int midIndex=(left+right)/2;

        //获取移动指针
        int moveLeftPoint=left;
        int moveRightPoint= midIndex+1;

        int count=left;

        //先往左边进行再次拆分
        mergeSort(orderByArrat,left,midIndex,tempArray);
        mergeSort(orderByArrat,moveRightPoint,right,tempArray);

        //排序当前对应的索引信息
        while(moveLeftPoint<=midIndex&&moveRightPoint<=right){
            if(orderByArrat[moveRightPoint]>orderByArrat[moveLeftPoint]){
                tempArray[count++]=orderByArrat[moveLeftPoint++];
            }else{
                tempArray[count++]=orderByArrat[moveRightPoint++];
            }
        }
        while(moveLeftPoint<=midIndex){
            tempArray[count++]=orderByArrat[moveLeftPoint++];
        }
        while(moveRightPoint<=right){
            tempArray[count++]=orderByArrat[moveRightPoint++];
        }
        count=left;
        while(count<=right){
            orderByArrat[count]=tempArray[count];
            count++;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值