归并排序示例:
把数组平均分成两半,若两个区间有序后,则进行归并。使两个区间有序和快排同样的方法一样,递归到最后只有一个值或者没有时即有序。但在归并时需要开辟一段空间把合并的数据存起来,再放回原数组。
时间复杂度:
N*logN
算法如下:
void _MergeSort(DataType* a, DataType* tmp, int left, int right)
{
//对数组进行划分
if (left >= right)
return;
int mid = left + ((right - left) >> 1);
_MergeSort(a, tmp, left, mid);
_MergeSort(a, tmp, mid+1, right);
//开始进行归并
int begin1 = left, begin2 = mid + 1;
int end1 = mid, end2 = right;
int index = left;
while (begin1 <= end1&&begin2 <= end2)
{
if (a[begin1] < a[begin2])
{
tmp[index++] = a[begin1++];
}
else
tmp[index++] = a[begin2++];
}
while (begin1 <= end1)
{
tmp[index++] = a[begin1++];
}
while (begin2 <= end2)
{
tmp[index++] = a[begin2++];
}
//将tmp数组的内容赋值给a数组
index = left;
while (index <= right)
{
a[index] = tmp[index];
index++;
}
}
void MergeSort(DataType* a, size_t n)
{
assert(a);
DataType* tmp = (DataType*)malloc(sizeof(DataType)*n);
_MergeSort(a,tmp,0,n-1);
free(tmp);//将申请的空间释放
}
void TestMergeSort()//测试归并排序
{
DataType a[] = { 2, 5, 6, 9, 8, 3, 1, 0, 7, 4 };
MergeSort(a, sizeof(a) / sizeof(DataType));
PrintfBuff(a, sizeof(a) / sizeof(DataType));
}
int main()
{
TestMergeSort();
return 0;
}