C++归并排序的实现
1、MergeSort.h
/* 初始版本,升序排序 */
/* 时间复杂度:O(nlbn) 将n个待排序记录归并次数为lbn,一趟归并O(n)
空间复杂度:O(n) 递归栈最大深度为[lbn] + 1 ,而辅助数组大小为n
稳定:无论最好还是最坏情况时间复杂度都是O(nlbn)
*/
#ifndef MERGESORT_H
#define MERGESORT_H
void Merge(int *arr, int n)
{
int temp[n]; // 辅助数组
int b = 0; // 辅助数组的起始位置
int mid = n / 2; // mid将数组从中间划分,前一半有序,后一半有序
int first = 0, second = mid; // 两个有序序列的起始位置
while (first < mid && second < n)
{
if (arr[first] <= arr[second]) // 比较两个序列
temp[b++] = arr[first++];
else
temp[b++] = arr[second++];
}
while(first < mid) // 将剩余子序列复制到辅助序列中
temp[b++] = arr[first++];
while(second < n)
temp[b++] = arr[second++];
for (int i = 0; i < n; ++i) // 辅助序列复制到原序列
arr[i] = temp[i];
}
void MergeSort(int *arr, int n)
{
if (n &