有序序列合并_牛客题霸_牛客网 (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;
}
今天的分享到此为止,主要是运用归并排序的思想,并且需要熟练掌握归并排序的思想,并且可以使用归并排序。