归并排序时一种使用分治思想实现的高效的排序算法,它的最好/最坏/平均时间复杂度都是O(nlogn),而且是一种稳定的排序算法。然而归并排序并没有得到广泛的应用,今天我们来看看归并排序的特点、优化和应用。
1. 算法简介
归并排序的原理
归并排序(Merge Sort)的核心思想就是一个典型的分治算法。如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。算法示意图如下:

代码实现如下:
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++];
}
};
由上面算法的实现我们可以看到,归并分解合并的过程就像一颗二叉树,树的高度是logn, 每层的合并时间复杂度是O(n)。归并算法的分解合并与数据是否有序无关

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





