算法4-归并排序算法

这篇博客详细介绍了归并排序的算法思想,包括如何通过递归将数组分为两部分并进行合并排序。代码示例展示了具体的实现过程。同时,文章分析了归并排序的时间复杂度,根据master公式得出其为O(N*log(N)),并解释了额外空间复杂度为O(N)的原因。

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

归并排序算法思想:

归并排序采用了递归的思想,假设数组中有N个数,则:
1)找到数组的中点位置mid,将数组从mid处分为两部分:左边部分和右边部分,分别在左边部分和右边部分上进行归并排序;
2)左边部分和右边部分归并排序完成后,设置一个辅助数组help,将左边部分和右边部分进行合并排序,排序结果先存放到help中,排序完成之后,将help中的结果复制回原数组。

归并排序代码:

public class MergeSort {
	public void mergeSort(int[] arr) {
		if (arr == null || arr.length < 2) {
			return;
		}
		mergeSort(arr, 0, arr.length - 1);
	}

	public void mergeSort(int[] arr, int l, int r) {
		if (l < r) {
			int mid = l + ((r - l) >> 1);//找中点位置
			mergeSort(arr, l, mid);
			mergeSort(arr, mid + 1, r);
			merge(arr,l,r,mid);//左边部分和右边部分合并
		}		
	}
	public void merge(int[] arr,int l,int r,int mid){
		int[] help = new int[r - l + 1];//辅助数组
		int p1 = l;
		int p2 = mid + 1;
		int i = 0;
		while (p1 <= mid && p2 <= r) {//p1和p2都不越界的情况下
			help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];
		}
		//下面的这两个while必然只会执行一个
		while (p1 <= mid) {
			help[i++] = arr[p1++];
		}
		while (p2 <= r) {
			help[i++] = arr[p2++];
		}
		for (i = 0; i < help.length; i++) {
			arr[l + i] = help[i];
		}
	}

归并排序的时间复杂度解析:

master公式:

T(N) = a * T(N / b) + O(N ^ d)

其中,T(N)指的是母问题的规模是N(就是说木问题一共有N个待处理的数据),T(N / b)指的是子问题的规模是N / b,a是指子问题规模等量(都是N / b)的情况下,子问题被调用了多少次,O(N ^ d)是指除了递归调用之外,剩下处理过程的时间复杂度

凡是符合这样行为细节的递归算法,也就是满足子问题等规模的递归算法,它的时间复杂度都可以直接求:

1)logb(a) < d 时,该算法的时间复杂度是O(N ^ d)
2)logb(a) > d 时,该算法的时间复杂度是O(N ^ logb(a))
3)logb(a) == d 时,该算法的时间复杂度是O(N ^ d * log(N))

其中,logb(a)表示以b为底a的对数

在归并排序中,a = 2,b = 2,d = 1(因为要将help中的数据复制回原数组,所以额外空间复杂度是O(N),所以d = 1),故归并排序的时间复杂度为O(N * log (N)).

归并排序的额外空间复杂度解析:

help数组最长是N,所以归并排序的额外空间复杂度是O(N)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值