数据结构与算法:归并排序的C++实现

任务:利用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);
}

猜你喜欢

转载自blog.csdn.net/weixin_44928892/article/details/109089258