首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【算法】归并排序

【算法】归并排序

作者头像
半生瓜的blog
发布2023-05-13 13:38:27
发布2023-05-13 13:38:27
4240
举报
文章被收录于专栏:半生瓜のblog半生瓜のblog

归并排序

当两组数据已经有序,我们可以通过以下方式让两组数据快速排序。

依次从两组数据中取前面最小的元素放到新的数组中,然后再把新数组中有序的数据拷贝到原数组,完成排序。这就是归并思想。

代码实现

代码语言:javascript
复制
#include<iostream>
using namespace std;

void mergeAdd(int* arr,int left,int mid,int right)
{
	int temp[64] = { 0 };
	int i = left;//指向左边数组最小的元素位置
	int j = mid;//指向右边数最小的元素位置
	int k = 0;//临时数组下标

	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++];
	}
	//把temp中内容拷贝到
	memcpy(arr + left, temp+left, sizeof(int) * (right - left + 1));
	
}

void print(int* arr,int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}
int main(void)
{
	int arr[] = { 1,3,5,7,2,4,6,8 };
	int len = sizeof(arr) / sizeof(arr[0]);
	int mid = len / 2;
	mergeAdd(arr, 0,mid, len - 1);
	print(arr, len);
	return 0;
}

当数据无序的时候,只用归并思想就无法实现排序了。


依靠这种思想引出归并排序方法

下面是一组待排序的数组。

以中间为界,分为两个数组。

再进行细分

再分

利用上面的归并思想将两个数组分别有序

最后合并到一起。

代码实现(分治法+归并思想)

代码语言:javascript
复制
#include<iostream>
using namespace std;

//归并法,将两个有序的数组合并到一起
void mergeAdd(int* arr,int left,int mid,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++];
	}
	//排好序的存到原来的位置——分块排序时,对应位置的元素,分治归并后还放在对应的位置。
	memcpy(arr + left, temp+left, sizeof(int) * (right - left + 1));
	
}

void print(int* arr,int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}

void mergeSort(int* arr,int left,int right,int* temp)
{
	int mid = 0;
	if (left < right)
	{
		mid = left + (right - left) / 2;//找中间值
		mergeSort(arr, left, mid, temp);
		mergeSort(arr, mid + 1, right, temp);
		mergeAdd(arr, left,mid+1, right, temp);//mid在整合的时候算在右边那半
	}
}
int main(void)
{
	int arr[] = { 3,1,4,5,5,4,1,3};
	int len = sizeof(arr) / sizeof(arr[0]);
	int mid = len / 2;
	int* temp = new int[len];
	mergeSort(arr, 0, len - 1, temp);
	mergeAdd(arr, 0,mid, len - 1,temp);
	print(arr, len);
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 归并排序
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档