Java归并排序

该博客详细介绍了如何使用Java实现归并排序算法,包括主要的`mergeSort`方法和辅助的`merge`方法,展示了从数组分割到归并的过程,以确保排序的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.util.Arrays;

public class MergeSort {
    public static void main(String[] args) {
        int[] arr = new int[]{2,4,1,2,6,7,4,3,3,6,7,3,2,4,5,3,2,23,1,43,2,4,3,22,4,2,-2829};
        System.out.println("Before mergeSort: " + Arrays.toString(arr));
        mergeSort(arr, 0, arr.length - 1);
        System.out.println("After mergeSort: " + Arrays.toString(arr));
    }

    // 归并排序
    public static void mergeSort(int[] array, int lo, int hi) {
        if (lo == hi) return;

        // 求出中点
        int mid = lo + ((hi - lo) >> 1);
        // 排序左边的
        mergeSort(array, lo, mid);
        // 排序右边的
        mergeSort(array, mid + 1, hi);

        // 归并两边的有序数组
        merge(array, lo, mid, hi);
    }

    // 归并排序中的归并过程,即将两个有序数组通过双指针归并到一起
    public static void merge(int[] array, int lo, int mid, int hi) {
        // 定义一个辅助的数组helper
        int[] helper = new int[hi - lo + 1];
        // 定义一个helper使用的索引index
        int index = 0;
        // 定义指向左右两边的指针
        int leftPoint = lo, rightPoint = mid + 1;

        // 将两边的数按照最小的依次放到helper中
        while (leftPoint <= mid || rightPoint <= hi) {
            // 这样比较 可以处理某一边越界的情况 可以少写两个while循环
            int leftVal = leftPoint > mid ? Integer.MAX_VALUE : array[leftPoint];
            int rightVal = rightPoint > hi ? Integer.MAX_VALUE : array[rightPoint];
            helper[index++] = leftVal <= rightVal ? array[leftPoint++] : array[rightPoint++];
        }

        // 此时helper中的数就是从lo到hi是有序的,将其拷贝回array的对应部分
        System.arraycopy(helper, 0, array, lo, hi + 1 - lo);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值