归并排序

本文介绍了归并排序的两种实现方式:自顶向下和自底向上。详细解释了归并过程及其实现细节,并分析了其时间复杂度。

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

		public static void merge(int[] a,int lo,int mid,int hi){
			int i = lo ,j = mid + 1;             
			
			for(int k=lo;k<=hi;k++){
				aux[k] = a[k];
			}		
			
			for(int k=lo;k<=hi;k++){
				if(i > mid) {					a[k] = aux[j++]; //左边越界,放右边元素
				}else if(j > hi){				a[k] = aux[i++]; //右边越界,放左边元素
				}else if(less(aux[i],aux[j])){ 			a[k] = aux[i++]; //主要比较操作,放入较小元素
				}else{ 						a[k] = aux[j++]; //同上
				}
				
			}
		}

既然是归并排序,当然要把两个有序的小数组归并为一个有序的大数组。其中:i和j为两个数组的起点;再利用辅助数组aux,在数组a上排序。


下面有两种归并排序的实现:自顶向下 ;  自底向上

1 自顶向下:

		public static void mergeSort(int[] a){
			aux = new int[a.length];
			mergeSort(a,0,a.length-1); //自顶向下  
		}
		
		public static void mergeSort(int[] a,int lo,int hi){
			if(hi <=lo) {
				return;
			}
			int mid = lo + (hi-lo) / 2;
			mergeSort(a,lo,mid);      //排序左半边数组
			mergeSort(a,mid+1,hi);	  //排序右半边数组
			merge(a,lo,mid,hi);	  //调用归并
			
		}

在mergeSort函数中,先申请了一个固定长度的aux数组(这个函数只执行了一次).再调用带lo和hi参数的mergeSort函数。

思想:利用嵌套先将大数组拆至长度为一的小数组,再归并为有序的大数组。


2 自底向上:

		public static void mergeSort(int[] a){
			aux = new int[a.length];
			for(int sz=1;sz<a.length;sz = sz+sz){
				for(int lo=0;lo<a.length-sz;lo+=sz+sz){                      //自底向上
					merge(a,lo,lo+sz-1,Math.min(lo+sz+sz-1, a.length-1));
				}
			}
		}

在mergeSort函数中,利用循环将直接从长度为1的小数组开始进行归并。下一次循环小数组长度为2,4,8,16....。


归并排序复杂度:

在此排序算法中用到了辅助空间保存临时数组。所以空间复杂度不是最优;其最坏的时间复杂度~NlgN。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值