【数据结构】排序算法之归并排序

【算法思想】归并排序是利用归并的思想实现的排序方法,该算法采用“分而治之”的思想将问题分成一些小的问题然后递归实现,最后合而为之。

【图解】


【代码实现】

----->递归实现

void Merge(int* arr, const int left, const int mid, const int right, int *temp)
{
	int i = left;//检测指针
	int j = mid;//检测指针
	int k = left;//存放指针
	while (i < mid && j < right)//俩个区间都没检查完,两两比较
	{
		if (arr[i] < arr[j])
			temp[k++] = arr[i++];
		else
			temp[k++] = arr[j++];
	}
	while (i < mid)//若第一个区间未检测完,直接复制过来
	{
		temp[k++] = arr[i++];
	}
	while (j < right)//若第二个区间未检测完,直接复制过来
	{
		temp[k++] = arr[j++];
	}
	//将已经排好序的辅助空间的值拷贝到原数组arr中
	memcpy(arr + left, temp + left, (right - left)*sizeof(int));
}
void _MergeSort(int *arr,int left,int right,int *temp)
{
	if (right - left <= 1)//剩余一个元素就不处理了
		return;
	if (left < right)
	{
		int mid = left + ((right - left) >> 1);//从中间划分为两个子区间
		_MergeSort(arr, left, mid, temp);//对左侧子序列进行递归排序
		_MergeSort(arr, mid, right, temp);//对右侧子序列进行递归排序
		Merge(arr, left, mid, right, temp);//合并
	}
}
void MergeSort(int *arr, int size)
{
	assert(arr);
	int *temp = new int[size];
	_MergeSort(arr, 0, size, temp);
	delete[] temp;
}

------->非递归实现

void Merge(int* arr, const int left, const int mid, const int right, int *temp)
{
	int i = left;//检测指针
	int j = mid;//检测指针
	int k = left;//存放指针
	while (i < mid && j < right)//俩个区间都没检查完,两两比较
	{
		if (arr[i] < arr[j])
			temp[k++] = arr[i++];
		else
			temp[k++] = arr[j++];
	}
	while (i < mid)//若第一个区间未检测完,直接复制过来
	{
		temp[k++] = arr[i++];
	}
	while (j < right)//若第二个区间未检测完,直接复制过来
	{
		temp[k++] = arr[j++];
	}
	//将已经排好序的辅助空间的值拷贝到原数组arr中
	memcpy(arr + left, temp + left, (right - left)*sizeof(int));
}
void MergeSortNor(int *arr, int size)
{
	int * temp = new int[size];
	int gap = 1;
	while (gap < size)
	{
		for (int i = 0; i < size; i += 2*gap)
		{
			int left = i;
			int mid = i + gap;
			int right = mid + gap;
			if (mid>size)//如果越界
			{
				mid = size;
			}
			if (right > size)//如果越界
			{
				right = size;
			}
			Merge(arr, left, mid, right, temp);
		}
		gap *= 2;
	}
	delete[] temp;
}

----->测试代码

void Print(int* arr, int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
int main()
{
	int arr[] = { 2, 0, 4, 6, 5, 7, 5, 8, 9};
	Print(arr, sizeof(arr) / sizeof(arr[0]));
	MergeSort(arr,sizeof(arr) / sizeof(arr[0]));
	//MergeSortNor(arr, sizeof(arr) / sizeof(arr[0]));
	Print(arr, sizeof(arr) / sizeof(arr[0]));
	getchar();
	return 0;
}

代码如存在问题,欢迎指导~~~~!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值