归并排序时一种使用分治思想实现的高效的排序算法,它的最好/最坏/平均时间复杂度都是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++];
}
};
由上面算法的实现我们可以看到,归并分解合并的过程就像一颗二叉树&#