排序算法之归并算法

本文深入探讨归并排序算法的原理与实现细节,通过分解与合并策略高效整合数据,适用于数组、文件及网络中数据的排序操作。利用辅助数组进行有序合并,展示算法效率与实用性。

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

归并多用于数据放在不同的地方(数组,文件 ,网络)我们要将其合在一起汇总排序。这些不同地方的数据是有序的,我们再造一个空间是两个数据的长度之和(这里我写的是二路归并)。每次拿两个数据的第一个来比较,谁小依次就放到新开的空间当中,继续比较放值。(每次都是两个数据的头来比较,比一个放一个,边读边比,速度很快的)。这里还有一个很好玩的东西,那就是用一个临界点来控制两个递归,一个分解递归一个合并递归。得意稍微转了几个圈,有点晕快哭了。最后把辅助数组的值写到所要的数组当中。
package cn.hncu.sorts;

public class SortWay2 {
	//输出函数
	private static void print(int[] a) {
		for(int num:a){
			System.out.print(num+" ");
		}
		System.out.println();
	}
	//交换数组位置函数
	private static void swap(int[] a, int j, int i) {
		int temp;
		temp=a[i];
		a[i]=a[j];
		a[j]=temp;
	}
	
	private static void mergeSort(int[] a, int left, int right) {
		if(left<right){//卫条件防护
			//1先分解
			  //把整个数组分解成:[left,mid] 和 [mid+1, right]  ----mid=(left+right)/2
			int mid=(left+right)/2;
			mergeSort(a,left,mid);
			mergeSort(a,mid+1,right);
			//2归并
			int[] b=new int[a.length];
			merge(a,b,left,mid,right);
			//把辅助数组b中的值写到a数组当中
			coppyArray(a,b,left,right);
		}
	}
	
	
	private static void coppyArray(int[] a, int[] b, int left, int right) {
		for(int i=left;i<=right;i++){
			a[i]=b[i];
		}
	}
	private static void merge(int[] a, int[] b, int left, int mid, int right) {
		int p=left;//游标,遍历a[left,mid]
		int r=mid+1;//游标,遍历a[mid+1,right]
		int k=left;//游标,遍历b[].合并后结果数组。指定当前判断之后所选中的元素应该放在哪个位置
		while(p<=mid&&r<=right){
			if(a[p]<a[r]){
				b[k]=a[p++];
			}else{
				b[k]=a[r++];
			}
			k++;
		}
		//把其中一个子序列当中剩余的元素直接照搬到归并结果数组当中
		if(p>mid){//左序列已经完成了,还剩右序列照搬进b数组
			for(int i=r;i<=right;i++){
				b[k++]=a[i];
			}
		}else{//右序列已经完成,还剩左序列照搬b数组
			for (int i = p; i <=mid; i++) {
				b[k++]=a[i];
			}
		}
	}
	public static void main(String[] args) {
		int[] a={21,22,5,7,86,57,9,-2,37,-8};
		//归并排序
		mergeSort(a,0,a.length-1);
		print(a);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值