排序算法之归并排序

排序算法之归并排序

话不多说 直接上代码


代码如下(示例):

package com.MySort;
import com.MyFunctions.GetRodomArrays;
import java.util.Arrays;
public class MargeSort {
    public static void main(String[] args) {
        int arr[] = GetRodomArrays.acquireUniqueArr(15,10);
        System.out.println(Arrays.toString(arr));
        margeSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }

    private static void margeSort(int[] arr, int begin, int end) {
        if(begin<end&&end>=0){
            int midle  = (begin+end)>>>1;
//            midle本来就向下取整 本次递归有增量或者说是变量
            margeSort(arr,begin,midle);
//            middle 是变量!!!
            margeSort(arr,midle+1,end);
            marge(arr,begin,midle,end);
        }
    }

    //        复制一份数组
    private static void marge(int[] arr, int begin, int mid,int end) {
        int[] helper = Arrays.copyOf(arr, arr.length);

//        原数组最终的指针
        int current = begin;
//        左半边的指针
        int left = begin;
//        右半边的指针
        int right = mid + 1;
        while (left <= mid && right <= end) {
            if (helper[left] < helper[right]) {
                arr[current] = helper[left];
                left++;
                current++;
            } else {
                arr[current] = helper[right];
                right++;
                current++;
            }
        }
//        上面这个while循环走完,至少有一边的指针已经打到头了
//        为了有另一边的辅助数组里面还有未处理的数据 进行最后检查
//       如果左边没有打空  那就不用比较了 直接将剩余元素填入arr中
        while (left <= mid) {
            arr[current] = helper[left];
            current++;
            left++;
        }
//        如果右边没有打空,其实可以不用管,因为右边本来就是存放相对较大的元素 没有必要进行覆盖
//        while (right <=end) {
//            arr[current] = helper[right];
//            current++;
//            right++;
//        }
    }
}

2.读入数据

代码如下(示例):

运行结果


总结

主要是一种冒泡+分治+递归的算法。本算法主要学习分治的思想。(文章主要记录学习思路)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值