归并排序-java

归并排序

基本思想
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bBMGxt0B-1572357906885)(https://i.loli.net/2019/10/22/un5aQmBhGAcd1bE.png)]
从图上就能很明确的看出归并算法的原理, 这种结构也很像一颗完全二叉树

package sortalgorithm;

import java.util.Arrays;

/**
 * @author: xingt   mym_74@163.com
 * @date: 2019/10/22, 20:05
 * @version: 1.0
 */
public class MergeSort {
    public static void main(String[] args) {
        int[] arr1 = new int[]{1,5,7,8,2,3,7,7,9};
        System.out.println("排序前的数组为:"+ Arrays.toString(arr1));
        mergesort(arr1,0,arr1.length-1);
        System.out.println("mergesort后的数组为:" + Arrays.toString(arr1));
    }
    //归并排序
    private static void mergesort(int[] arr, int low, int high){
        // 将middle取值为中间值, high+low 而不是high-low 是因为操作的是原数组中 的索引,而不是merge中新建一个数组得到新数组的长度
        int middle=(high+low)/2;
        //low<high 是递归的停止,也就是只有一个数字了
        if(low<high) {
            //处理左边
            mergesort(arr, low, middle);
            //处理右边
            mergesort(arr, middle + 1, high);
            //归并的操作
            merge(arr, low, middle, high);
        }
    }

    private static void merge(int[] arr, int low, int middle , int high){
        //临时数组用于储存变量
        int[] temp = new int[high-low+1];
        //记录第一个数组需要遍历的下标
        int i = low;
        //记录第二个数组需要遍历的下标
        int j = middle+1;
        //记录临时数组需要存放的下标
        int index = 0;
        //遍历2个数组,小的放入到temp数组里面
        while(i<=middle && j<=high) {
            if (arr[i] < arr[j]) {
                temp[index] = arr[i];
                i++;
            } else {
                temp[index] = arr[j];
                j++;
            }
            index++;
        }
        //遍历完一边的数组之后,处理剩余的数组
        while(i<=middle){
            temp[index]=arr[i];
            i++;
            index++;
        }

        while(j<=high){
            temp[index]=arr[j];
            j++;
            index++;
        }
        // copy 临时数组到arr中去, 也就是从arr的low位置开始放
        for(int k=0;k< temp.length; k++){
            arr[k+low] = temp[k];
        }

    }
}



  1. 图解排序算法(四)之归并排序 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值