算法描述(升序):
1、将数列平均分为两个子数列
2、将每个子序列再进行平均分
3、分无可分时,对子数列进行排序,然后一层一层的回归父数列进行排序
图解(网图,侵删):
代码:
#include <iostream>
#include <vector>
using namespace std;
void sort(int, int, vector<int> &a, vector<int> &r);
void merge(int, int, int, vector<int> &a, vector<int> &r);
int main()
{
vector<int> arr = {9, 8, 7, 6, 5, 4, 3, 2, 1};
int len = arr.size();
vector<int> res;
res.resize(len);
sort(0, len - 1, arr, res);
for (int i = 0; i < len; i++)
cout << arr[i] << " ";
return 0;
}
void sort(int head, int rear, vector<int> &a, vector<int> &r)
{
if (head < rear)
{
int mid = (head + rear) / 2;
sort(head, mid, a, r);
sort(mid + 1, rear, a, r);
merge(head, mid, rear, a, r);
}
}
void merge(int head, int mid, int rear, vector<int> &a, vector<int> &r)
{
int i = head;
int j = mid + 1;
int t = 0;
while (i <= mid && j <= rear)
{
if (a[i] >= a[j])
r[t++] = a[j++];
else
r[t++] = a[i++];
}
while (i <= mid)
r[t++] = a[i++];
while (j <= rear)
r[t++] = a[j++];
while (head <= rear)
a[rear--] = r[--t];
}
算法分析:
时间复杂度:始终为O(nlogn)
空间复杂度:需要额外的空间
稳定性:元素的前后位置不会被改变,所以是稳定的排序算法