排序算法之归并排序

本文详细介绍了归并排序的实现过程,包括如何通过递归分散数组,然后进行有序合并。代码示例展示了如何使用Java实现归并排序,特别强调了在分割和合并过程中数据的流动以及栈操作。博客还配有一张切割和合并的图,帮助理解算法的执行步骤。

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

归并排序指的是先用递归分散,再合并的排序方法,直接上代码

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

    public static void mergeSort(int data[], int left, int right) {
        if (left < right) {
            // 取中间分割的下标
            int mid = (left + right) / 2;
            // 切分左半边数据
            mergeSort(data, left, mid); // 有弹栈的操作
            // 切分右半边数据
            mergeSort(data, mid + 1, right);
            // 合并数据
            mergeData(data, left, mid, right);
        }
    }

    public static void mergeData(int data[], int left, int mid, int right) {
        // 定义一个临时数组,用来装数据
        int temp[] = new int[data.length];
        // 当前数组起始值
        int loc = left;
        // 左半边起始值
        int point1 = left;
        // 右半边其实值
        int point2 = mid + 1;
        // 判断下标是否小于等于临界值
        while (point1 <= mid && point2 <= right) {
            if (data[point1] < data[point2]) {
                temp[loc] = data[point1];
                loc++;
                point1++;
            } else {
                temp[loc] = data[point2];
                loc++;
                point2++;
            }
        }
        // 将左半边还没有变换位置的放到temp数组
        while (point1 <= mid) {
            temp[loc++] = data[point1++];
        }
        // 将右半边还没有变换位置的放到temp数组
        while (point2 <= right) {
            temp[loc++] = data[point2++];
        }
        // 将原本的数组进行排序
        for (int i = left; i <= right; i++) {
            data[i] = temp[i];
        }
    }
}

归并排序的切割左边部分、右边部分两个方法不会去同时执行,按照顺序先切割左边数据,再切割右边数据。合并数据时也是先合并左边数据,再合并右边数据。注意方法执行时放在栈中,有弹栈的操作,不会重复的进行if (left < right)的判断,通常是切割左边方法执行完了,执行右边切割方法,然后合并的方法

附一张切割和合并的图:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值