归并排序算法

归并排序

  算法思想:归并排序是典型的分治思想的体现;

          1. 首先通过递归将数组划分为最小的子数组(长度为1); 

          2. 然后利用辅助数组将最小的两个数组合并为一个新的有序数组,然后回溯到上一个子数组,再进行合并,通过几轮的回溯合并就完成数组的排序;

 实现代码:

 

package sort;

import java.util.Arrays;

/**
 * @author yangpeng
 * @create 2021-05-31 23:09
 */
public class MergetSort {
    public static void main(String[] args) {
        int []arr={2,0,4,3,6,8,2};
        int [] temp=new int[arr.length];  //声明一个与原数组一样大的辅助数组
        mergetSort(arr,0,arr.length-1,temp);
        System.out.println(Arrays.toString(arr));

    }

    /**
     * 分割数组,即“分”
     * @param arr
     * @param left
     * @param right
     * @param temp
     */
    public static  void mergetSort(int[] arr,int left,int right,int []temp){  //分

        if(left<right){
            int mid=(left+right)/2;   //找到中间元素下标,利用递归进行分割
            mergetSort(arr,left,mid,temp);
            mergetSort(arr,mid+1,right,temp);
            merge(arr,left,right,temp);      //分割到两个子数组都只有一个元素时进行合并,也就是“治”,这样数组就会从最小子数组进行合并,然后不断回溯,一直合并至原数组有序;
        }

    }

    /**
     *   合并子数组,即“治”
     * @param arr 待排序的数组
     * @param left
     * @param right
     * @param temp
     */
    public static void merge(int []arr,int left,int right,int [] temp){
        int mid=(left+right)/2;  //子数组的中间元素
        int index=left;          //辅助数组的初始下标
        int l=left;               //左边子数组的索引下标
        int r=mid+1;             //右边子数组的索引下标
        while(l<=mid&&r<=right){ //将两个子数组合并到辅助数组中
            if(arr[l]<arr[r]){     //选择两个子数组中较小的值赋给辅助数组
                temp[index++]=arr[l++];
            }else{
                temp[index++]=arr[r++];
            }
        }
        //若左边子数组还有元素未合并,则追加到辅助数组后面
        while(l<=mid){
            temp[index++]=arr[l++];
        }
        //若右边子数组还有元素未合并,则追加到辅助数组后面
        while(r<=right){
            temp[index++]=arr[r++];
        }
        //将临时数组的值赋给原数组
        for(int i=left;i<=right;i++){
            arr[i]=temp[i];
        }
    }

}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值