1. 基本思想
1. 申请一个与待排序数组一样大小的辅助数组
2. 利用递归将待排序数组划分到每组只剩一个元素,相邻的两组有序序列进行合并
3. 最终得到全部有序
2. 代码案例实现
#include<iostream>//O(nlogn)
using namespace std;
#define n 10 //辅助数组b的大小
int* b = (int*)malloc(n * sizeof(int)); //辅助数组b
//合并有序序列low到mid与mid+1到high
void merge(int a[], int low, int mid, int high) {
int i, j, k;
//将a数组的元素复制到辅助数组b中
for (int k = low; k <= high; k++) {
b[k] = a[k];
}
//合并 选择较小的一个放到a[k]中
for (i = low, j = mid + 1, k = i; i <= mid && j <= high; k++) {
if (b[i] <= b[j]) {
a[k] = b[i++];
}
else {
a[k] = b[j++];
}
}
while (i <= mid) {
a[k++] = b[i++];
}
while (j <= high) {
a[k++] = b[j++];
}
}
//归并排序
void mergeSort(int a[], int low, int high) {
if (low < high) {
int mid = (low + high) / 2;
mergeSort(a, low, mid);
mergeSort(a, mid + 1, high);
merge(a, low, mid, high);
}
}
int main() {
int a[] = { 2,5,1,7,10,6,9,4,3,8 };
mergeSort(a, 0, 9);
for (int i = 0; i < 10; i++)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}
3. 运行结果
4. 时间复杂度
最好最坏平均都是O(nlogn)
5. 空间复杂度
O(n)(需要一个辅助数组)
6. 稳定性
稳定