java数据结构与算法之排序之归并排序

本文深入讲解归并排序的实现原理及Java代码实现过程。通过详细步骤解析如何将数组拆分成子数组并逐步合并成有序数组。同时展示了具体的代码示例及运行结果。

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

MergeSorting.java

package com.zhanglei.mergesorting;

import java.util.Arrays;

public class MergeSorting {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr= new int[] {2,1,4,3,5,6,8,6,7,9,2};
		int[] temp=new int[arr.length];
		mergeSort(arr,0,arr.length-1,temp);
		System.out.println("After mergeSorting:"+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);
		}	
	}
	
	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从索引0开始存储
		while(i<=mid&&j<=right) {
			if(arr[i]<=arr[j]) {
				temp[t]=arr[i];
				t++;
				i++;
			}else {
				temp[t]=arr[j];
				t++;
				j++;
			}		
		}		
		if(i>mid) {
			while(j<=right) {
				temp[t]=arr[j];
				t++;
				j++;				
			}		
		}
		if(j>right) {
			while(i<=mid) {
				temp[t]=arr[i];
				t++;
				i++;				
			}		
		}
		
//		for(int e=0;e<arr.length;e++) {//错误的写法
//			arr[e]=temp[e];
//		}
		t=0;
		for(int e=left;e<=right;e++) {//temp从0开始,但是arr是从left开始
			arr[e]=temp[t];
			t++;
		}
		
	}

}

输出结果:

After mergeSorting:[1, 2, 2, 3, 4, 5, 6, 6, 7, 8, 9]

备注1:

  1. 归并排序的原理:将原数组从中间分开为两个子数组,接着对两个子数组也进行相同的操作,直到只剩一个为止,然后再依次将同一层的两个主体(注意每个主体都是有序的)排序为一个有序的主体,比如最后一次排序就是第一次分开的两个子数组各自已经有序了,再将这两个有序的子数组合并为一个有序的大数组。
  2. 合并的实现方法:比如现在有两个有序的小主体,我们要合并为一个有序的大主体。需要使用到一个temp数组,将两个小主体依次比较放入temp中,当某个小主体提前遍历结束时,将另一个小主体的剩余元素全部放入temp中,最后再将temp中的元素全部复制回原数组的指定区间(因为arr是数组引用,而归并排序用到也是首尾指针,以及中间指针,所以只要将temp中的元素复制到arr的指定指针之间就可以实现对原数组的修改)
  3. 下面我用一个例子来演示一下:
    在这里插入图片描述
    在这里插入图片描述
  4. 比如我们从ms(a,0,1,t)分支可以看出,当只有两个元素时,由于两个stop(即该子程序终止了)的存在,主程序会进行两个元素的合并(这是终止分离开始合并的合并),是整个归并排序的最小单元!!!
  5. 合并都是同一级的合并,即从树上看是在同一层(同一层是指分离的时候,而不是合并的时候)

备注2:

  • 归并排序速度跟快速排序差不多,代码就此省略
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值