归并排序

归并排序的原则为分而治之,主要思想为一下几个步骤

1.首先什么是“分”?就是讲每个数据集分成一个独立的小单元。

2.再次,将分割后的独立的小单元进行排序。

3.最后,将分割排序后的小单元进行两两合并,组成新的有序数据集。

如下图所示

 

核心代码如下:

main方法的入口,主要做两个操作,创建排序好的存放数组,和限定排序的范围

public static void mergeSort(int arr[]) {
    int[] temp = new int[arr.length];
    mergeSort(arr, 0, arr.length - 1, temp);
    Arrays.stream(temp).forEach(System.out::println);
}

进行递归操作,目的是将数据集分成独立的小单元,类似树的遍历(左边分割,右边分割,分割不了退回根节点,然后进行俩俩数据集合并)

public static void mergeSort(int arr[], int start, int end, int temp[]) {
    if (start < end) {
        int mid = (start + end) / 2;
        mergeSort(arr, start, mid, temp);
        mergeSort(arr, mid + 1, end, temp);
        merge(arr, start, mid, end, temp);
    }
}

核心操作主要为3个步骤,第一步进行分割时候,左右数据集比较。比较完成之后,根据大小依次放入新数聚集中(一般为数组),查看左右数据集是否都进行放入存放(因为左右数据集比较时,可能存在某侧的数据集已经排序完毕,但是另一侧却存在数据未进行操作)接着需要查看两侧数据集是否都进行数据操作。最后更新之前数据的数据顺序。

private static void merge(int[] arr, int left, int mid, int right, int[] temp) {
    int leftIndex = left;
    int rightIndex = mid + 1;
    int tempIndex = 0;
    // 左右比较第一步骤
    while (leftIndex <= mid && rightIndex <= right) {
        if (arr[leftIndex] >= arr[rightIndex]) {
            temp[tempIndex++] = arr[rightIndex++];
        } else {
            temp[tempIndex++] = arr[leftIndex++];
        }
    }
    
    //补充数据,第二步骤
    while(leftIndex<= mid ){
        temp[tempIndex++] = arr[leftIndex++];
    }

    while (rightIndex<=right){
        temp[tempIndex++] = arr[rightIndex++];
    }
    tempIndex = 0;
    //将temp中的元素全部拷贝到原数组中,第三步骤
    while (left <= right) {
        arr[left++] = temp[tempIndex++];
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值