介绍
归并排序是一种时间复杂度为O(n log n)级别的排序算法,并且是一种稳定的排序算法。因为它划分出的每一部分在空间上都是大小相同的。下面用C++实现了一个基本的归并排序算法,并对其进行优化改进。
具体思路
- 将需要排序的数组arr[l…r]一分为二,并设定一个中间位置索引mid,直到每组元素只有一个元素。
- 开辟一个临时数组temp[0…r-l],复制当前需要排序的数组arr[l…r]。
- 分别对temp[0…mid-l]和temp[mid-l+1…r-l]的首元素比较,符合排序要求覆盖到arr,直到所有temp中的元素都重新覆盖原来到arr数组。
代码实现
#include<bits/stdc++.h>
using namespace std;
template<class T>
void _merge(T arr[], int l, int mid, int r) {
//开辟一个临时数组用于存放归并后的元素
T* temp = new T[r-l+1];
for(int i = l; i <= r; i++) {
temp[i-l] = arr[i];
}
int i = l;
int j = mid+1;
for(int k = l; k <= r; k++) {
//当左边元素都已排好
if(i > mid) {
arr[k] = temp[j-l];
j++;
}
//当右边元素都排好
else if(j > r) {
arr[k] = temp[i-l];
i++;
}
//左边元素较小时
else if(temp[i-l