数据结构与算法--归并排序原理

本文深入讲解归并排序的原理及实现过程,通过图解详细分析如何将多个有序数组合并为一个大数组,同时提供Java代码示例,演示归并排序的具体操作步骤。

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

归并排序的定义

就是将两个或者两个以上有序表合并成一个行的有序表,原理是假设初始序列有n个记录,则可以看成有n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或者1的有序的子序列;再两两归并。。。重复直到得到一个长度为n的有序序列。
图解:

归并排序图解
分析:

  • 首先要注意的就是有序列表
  • 将两个列表合并起来。

合并两个列表的时候也要考虑以下问题:

  • 在遍历的时候要考虑是否数组到达了最后一个位置。

思路:

  • 将指针初始位置设置为两个有序列表的开头位置;
  • 依次比较数组中的数据的大小;
  • 直到某一个数组全部遍历将剩下有序列表中未遍历的数据一次存放在归并的数组数据的后面。
public class MergeTest {
    public static void main(String[] args){
        int[] a = {1,8,11,19,23};
        int[] b = {3,4,7,12};
        //将两个数组惊醒排序后得到新的数组
        int[] c = merge(a,b);
        //最后遍历c
        for (int num:c){
            System.out.print(num + " ");
        }
    }   
private static int[] merge(int[] a, int[] b) {
        //定义归并后的数组为tempArr
        int[] tempArr = new int[a.length + b.length];
        //数组的下表
        int ai = 0;//数组a的下表
        int bi = 0;//数组b的下标
        int ti = 0;//数组temp数组的下标

        //较小的值放入temoArr中
        while (ai<a.length && bi<b.length) {//下标值小于数组的长度循环
            if (a[ai] <= b[bi]) {
                tempArr[ti++] = a[ai++];//先赋值然后下标移动到下一位置
            } else {
                tempArr[ti++] = b[bi++];
            }
        }
        //如果某一个数组比较完毕则剩下的未比较的数组依次放入归并数组
        while (ai<a.length){
            tempArr[ti++] = a[ai++];
        }
        while (bi<b.length){
            tempArr[ti++] = b[bi++];
        }
        return tempArr;


输出的结果为:1 3 4 7 8 11 12 19 23 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值