有序序列的合并(归并排序)

有序序列合并_牛客题霸_牛客网 (nowcoder.com)

以这个提为例,目的主要是理解归并排序!

当我看到这个题目的时候,首先想到的就是归并排序。

但是,我们要首先理解,并会熟练使用归并排序才可以。

归并排序的实现过程

归并排序的主要意思说白了就是将两个数组合并再排序(这里要求这两个数组分别是有序的)。

我们用到的方法是下标法:

 用下标分别遍历这两个数组,并且相比较,将小的值赋给一个新的数组中的数据,然后将下标向后移动一位,如果有任何一个数组中元素被遍历完了,那么就对另一个没有遍历完的数组单独进行遍历。代码如下:

void MergeData(int arr1[],int arr2[], int top1, int last1, int top2,int last2, int tmp[])
{
	int begin1 = top1, end1 = last1;
	int begin2 = top2, end2 = last2;
	int index = top1;
	while (begin1 < end1 && begin2 < end2)
	{
		if (arr1[begin1] <= arr2[begin2])
			tmp[index++] = arr1[begin1++];
		else
			tmp[index++] = arr2[begin2++];
	}
	while (begin1 < end1)
	{
		tmp[index++] = arr1[begin1++];
	}
	while (begin2 < end2)
	{
		tmp[index++] = arr2[begin2++];
	}
}

注意:

1.需要一个元素作为下标来存储新数组的数据

2.注意判断条件 当两个元素相等时任取一个就行

结合上述代码,可以将刚开始在牛客网发的链接题给简单的做一下。

代码如下:

#include<stdio.h>

void MergeData(int arr1[],int arr2[], int top1, int last1, int top2,int last2, int tmp[])
{
	int begin1 = top1, end1 = last1;
	int begin2 = top2, end2 = last2;
	int index = top1;
	while (begin1 < end1 && begin2 < end2)
	{
		if (arr1[begin1] <= arr2[begin2])
			tmp[index++] = arr1[begin1++];
		else
			tmp[index++] = arr2[begin2++];
	}
	while (begin1 < end1)
	{
		tmp[index++] = arr1[begin1++];
	}
	while (begin2 < end2)
	{
		tmp[index++] = arr2[begin2++];
	}
}
int main()
{
	int arr1[1000] = { 0 };
	int arr2[1000] = { 0 };
	int n = 0, m = 0;
	scanf("%d%d", &n, &m);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr1[i]);
	}
	for (int j = 0; j <m; j++)
	{
		scanf("%d", &arr2[j]);
	}
	int tmp[2000] = { 0 };
	MergeData(arr1, arr2, 0,n, 0, m, tmp);
	for (int k = 0; k < n + m; k++)
	{
		printf("%d ", tmp[k]);
	}
	return 0;
}

        今天的分享到此为止,主要是运用归并排序的思想,并且需要熟练掌握归并排序的思想,并且可以使用归并排序。

猜你喜欢

转载自blog.csdn.net/m0_57249790/article/details/123624529