归并排序的递归实现以及复杂度分析
#include "stdafx.h"
#include <iostream>
using namespace std;
#define MAX 9
#if 0
时间复杂度分析:
待排序列中的记录都需要扫描一遍,要耗费O[n]时间
递归深度也就是完全二叉树深度可知,整个归并排序要进行log2^n次
所以 总的时间复杂度为O[nlogn]
空间复杂度分析:
由于归并排序在归并过程中需要原始记录序列同样数量的存储空间存放
归并结果以及递归时深度为log2^n的栈空间,因此空间复杂度为O[n+logn]
归并排序是俩俩相邻比较,不存在跳跃,因此归并排序是一种稳定的排序算法
归并排序是一种比较占用内存,但却效率高且稳定的算法
#endif
//将俩个数组合并成一个数组
void Merge(int* list1, int list1_size, int* list2, int list2_size)
{
int l1_index = 0;
int l2_index = 0;
int tmp_index = 0;
int tmp[MAX];
while (l1_index < list1_size && l2_index < list2_size)
{
if (list1[l1_index] < list2[l2_index])
tmp[tmp_index++] = list1[l1_index++];
else
tmp[tmp_index++] = list2[l2_index++];
}
while (l1_index<list1_size)
tmp[tmp_index++] = list1[l1_index++];
while (l2_index<list2_size)
tmp[tmp_index++] = list2[l2_index++];
//将临时数组中的值赋值给第一个数组
for (int i = 0; i < (list1_size + list2_size); i++)
list1[i] = tmp[i];
}
//将原来的数组递归分成一个个单独的数据 再将俩个相邻的单独数据合并
void Msort(int array[], int count)
{
//将数据量大于1的组分解
if (count > 1)
{
int* list1 = array;
int list1_size = count / 2;
int* list2 = array + list1_size;
int list2_size = count - list1_size;
Msort(list1, list1_size); //将左部分继续分解
Msort(list2, list2_size); //将右部分继续分解
Merge(list1, list1_size, list2, list2_size);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[] = { 50,10,90,30,70,40,80,60,20 };
Msort(a, MAX);
for (int i = 0; i <sizeof(a)/sizeof(a[0]); i++)
cout << a[i] << endl;
return 0;
}