本文介绍: ① 将序列每相邻两个数字进行归并操作,形成floor(n/2)个序列排序每个序列包含两个元素。② 将上述序列再次归并,形成floor(n/4)个序列每个序列包含四个元素。③ 重复步骤②,直到所有元素排序完毕。

实现逻辑
① 将序列每相邻两个数字进行归并操作,形成floor(n/2)个序列,排序后每个序列包含两个元素
② 将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素
③ 重复步骤②,直到所有元素排序完毕

void print_array(int a[], int n){
	for (int i = 0; i < n; ++i){
		cout << a[i] << " ";
	}
	cout << endl;
}

/************************************************************************
* 功能描述:二路归并排序(两个有序序列)
* 参	数:有序序列下标 f 第一个, s 第二个
* 日	期:2023/11/22                                                   
************************************************************************/
void merge(int arr[], int fBegin, int fEnd, int sBegin, int sEnd, int newArray[])
{
	int index = fBegin;//新数组下标
	int f = fBegin;//遍历第一个有序序列
	int s = sBegin;//遍历第二个有序序列

	while (f <= fEnd &amp;&amp; s <= sEnd)
	{
		if (arr[f] <= arr[s])
		{
			newArray[index++] = arr[f++];
		}
		else
		{
			newArray[index++] = arr[s++];
		}
	}

	while (f <= fEnd)
	{
		newArray[index++] = arr[f++];
	}

	while (s <= sEnd)
	{
		newArray[index++] = arr[s++];
	}
	memcpy(arr + fBegin, newArray + fBegin, sizeof(int) *(sEnd - fBegin +1));
}

//多路归并排序
void mergeSort(int arr[], int left, int right, int newArray[])
{
	if (left >= right)
	{
		return;
	}
	int mid = (left + right) / 2;
	mergeSort(arr, left, mid, newArray);
	mergeSort(arr, mid + 1, right, newArray);
	merge(arr, left, mid, mid + 1, right, newArray);
}

int main(){
	int arr[] = {10, 8, 11, 7, 4, 12, 9, 6, 5, 3};
	int len = sizeof(arr)/sizeof(arr[0]);
	int newArray[10] = {0};
	
	cout << "排序前:";
	print_array(arr, len);

	mergeSort(arr, 0, len - 1, newArray);
	
	cout << "排序后:";
	print_array(arr, len);
	return 0;
}

输出结果
在这里插入图片描述

原文地址:https://blog.csdn.net/YHB123___ahnd/article/details/134548548

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_3070.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注