归并排序效率惊人,10万条数据的数组排序只需20毫秒

归并排序充分利用递归的效率,提升排序速度,当内存够用时,用此方法进行大数据量排序比较适合


import java.util.Random;

//归并排序,两两递归的试一半一的分隔直接到只有一个元素时返回,然后对两两的有序数组进行归并排序,效率相当高
public class MergeSort {

    /**
     * @param sourceArray 要排序的源数据
     * @param temp        临时数据,因为归并时需要借用一个临时的数据
     * @param first       要排序的数组起始索引
     * @param end         要排序的数组结束索引
     */
    public void sort(int[] sourceArray, int[] temp, int first, int end) {
        //首先判断一下当前数组要排序是否只有一个元素,这个是返回条件
        if (first == end) {
            return;
        }

        int mid = (first + end) / 2;
        //前一段
        sort(sourceArray, temp, first, mid);
        //后一段
        sort(sourceArray, temp, mid + 1, end);
        //两段都返回时进行归并排序
        merge(sourceArray,temp,first,mid,end);
    }

    //mid 是包含在前段 升序
    public void merge(int[] sourceArray, int[] temp, int first, int mid, int end) {
        //首先记住起始位置
        int firstIndex = first;
        //长度
        int n = end - first + 1;
        int secondFirst = mid+1;
        int j=0; //临时索引
        while (first<=mid && secondFirst<=end){
            if(sourceArray[first]<=sourceArray[secondFirst]){
                temp[j++]=sourceArray[first++]; //后移一个
            }
            else{
                temp[j++] = sourceArray[secondFirst++];
            }
        }

        //考虑没有移动完的数据
        //前一段
        while (first<=mid){
            temp[j++] = sourceArray[first++];
        }

        //后一段
        while (secondFirst<=end){
            temp[j++] = sourceArray[secondFirst++];
        }

        //最后将临时数据拷贝到源数组,这区间数据代表排序完成
        for(int i=0;i<n;i++){
            sourceArray[firstIndex++]=temp[i];
        }
    }

    public static void main(String[] arsg) {
        int length=100000;
        int[] array = new int[length];
        for (int i = 0; i < length; i++) {
            array[i] = new Random().nextInt(100);
        }

        MergeSort mergeSort = new MergeSort();
        int[] tempArrary = new int[array.length];
        System.out.println("开始排序"+length+"元素.....");
        long start = System.currentTimeMillis();
        mergeSort.sort(array,tempArrary,0,array.length-1);
        long useMillis = System.currentTimeMillis()-start;
        System.out.println("排序完成,用时"+useMillis+"毫秒,约"+useMillis/1000.0 +"秒!");
  /*      for(int item : array){
            System.out.print(item+" ");
        }*/
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值