归并排序算法

归并排序 {8,4,5,7}的图解
在这里插入图片描述

package com.atguigu.sort;

import java.util.Arrays;

public class MyMergeSort {
    public static void main(String[] args) {
        int[] arr = {8,4,5,7,1,3,6,2};
        int[] temp = new int[arr.length];
        mergeSort(arr,0,arr.length -1,temp);
        System.out.println(Arrays.toString(arr));

    }

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

    }
    /**
     *
     * @param arr 待排序的数组
     * @param left 左子表最左边的初始索引
     * @param mid 中间索引
     * @param right 右子表最右边的初始索引
     * @param temp 临时数组,用于中转
     */
    public static void merge(int[] arr , int left ,int mid , int right , int[] temp){
        int i = left;//用于扫描左子表
        int j = mid + 1;//用于扫描右子表
        int t = 0;//用于遍历临时数组
        //扫描左右子表,比较大小后,将较小的放入temp中,直到处理完其中一个子表
        while(i <= mid && j <= right){//i j指针没有超过各自子表的范围,说明都还没处理完,要继续比大小
            if(arr[i] < arr[j]){
                temp[t] = arr[i];
                t++;
                i++;
            }else {
                temp[t] = arr[j];
                t++;
                j++;
            }
        }
        //退出循环,说明其中有一个子表已经处理完,需要将未处理完的子表中的剩余元素拷贝到temp中
        while(i <= mid){
            temp[t] = arr[i];
            t++;
            i++;
        }
        while(j <= right){
            temp[t] = arr[j];
            t++;
            j++;
        }
        //将temp数组拷贝到arr数组
        t = 0;
        while(left <= right){
            arr[left] = temp[t];
            left++;
            t++;
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值