归并排序及其优化(数组归并/链表归并,自顶向下/自底向上等)

本文介绍了归并排序的基本原理和优化策略,包括自底向上的归并算法和自顶向下的归并算法,特别讨论了在链表上的应用,分析了各自的时间和空间复杂度。归并排序通过分治思想,实现稳定且高效的排序,但在空间复杂度上较高。对于链表排序,自底向上的归并排序能以常数空间复杂度完成任务。

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

  归并排序时一种使用分治思想实现的高效的排序算法,它的最好/最坏/平均时间复杂度都是O(nlogn),而且是一种稳定的排序算法。然而归并排序并没有得到广泛的应用,今天我们来看看归并排序的特点、优化和应用。

1. 算法简介

归并排序的原理
  归并排序(Merge Sort)的核心思想就是一个典型的分治算法。如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。算法示意图如下:
image.png
  代码实现如下:

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
		int n = nums.size();
		temp.resize(n);
		mergeSort(nums, 0, n-1);
		return nums;
    }
private:
	vector<int> temp;
	void mergeSort(vector<int>& nums, int left, int right){
		if(left >= right) return;
		int mid = left+(right-left)/2;
		mergeSort(nums, left, mid);
		mergeSort(nums, mid+1, right);
		merge(nums, left, mid, right);
	}
	void merge(vector<int>& nums, int left, int mid, int right){
		for (int i = left; i <= right; ++i)
			temp[i] = nums[i];
		int i = left, j = mid+1, index = left;
		while(i <= mid && j <= right){
			if(temp[i] < temp[j])
				nums[index++] = temp[i++];
			else
				nums[index++] = temp[j++];
		}
		while(i <= mid)  nums[index++] = temp[i++];
		while(j <= right)  nums[index++] = temp[j++];
	}
};

 由上面算法的实现我们可以看到,归并分解合并的过程就像一颗二叉树&#

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值