任务:利用C++实现归并排序
代码如下:
#include <iostream>
#include <string>
#define NUM 10
using namespace std;
void Print(int a[], int len); // 打印数组信息
void Merge(int* a, int l, int m, int r); // 有序数组合并
void Recursion(int* a, int l, int r); // 合并递归
void MergeSort(int* a, int len); // 归并排序
int main()
{
int a[NUM] = { 23,12,2,4,214,63,36,213,63,45 };
cout << "before sort: ";
Print(a, NUM);
MergeSort(a,NUM);
cout << "after sort: ";
Print(a, NUM);
while (1);
return 0;
}
//打印数组信息
void Print(int a[], int len)
{
for (int i = 0; i < len; i++)
{
cout << a[i] << " ";
}
cout << endl;
}
// 有序数组合并(利用下标将数组a中的某一部分拆分为两个数组并进行合并排序)
void Merge(int* a, int l, int m, int r)
{
//定义临时数组
int len = r - l + 1;
int* pTemp = new int[len];
memset(pTemp, 0, len * sizeof(int));
int k = 0;
int left = l;
int right = m+1;
//比较两个数组当前下标数值的大小,小的存入临时数组中,同时指针加一
//当某一数组中的全部元素都已放入临时数组pTemp时,结束比较
while (left <= m && right <= r && k < len)
{
if (a[left] <= a[right])
{
pTemp[k++] = a[left++];
}
else
{
pTemp[k++] = a[right++];
}
}
//将剩余元素依次放入临时数组pTemp中
while (left <= m&& k < len)
{
pTemp[k++] = a[left++];
}
while (right <= r&& k < len)
{
pTemp[k++] = a[right++];
}
//将合并排序后的临时数组pTemp重新赋值给数组a的相应部分
memcpy(a + l, pTemp, len * sizeof(int));
delete[] pTemp;
pTemp = NULL;
}
// 合并递归(先将数组a拆分至单元素数组,再一步步套用合并排序算法Merge,最终完成对整个数组的归并排序)
void Recursion(int* a, int l, int r)
{
if (l == r)
{
return;
}
int m = (l + r) / 2;
Recursion(a, l, m);
Recursion(a, m + 1, r);
Merge(a, l, m, r);
}
// 归并排序(将算法封装为通用接口)
void MergeSort(int* a, int len)
{
Recursion(a, 0, len - 1);
}