c语言中的merge函数
发布网友
发布时间:2022-04-21 17:36
我来回答
共3个回答
热心网友
时间:2022-05-03 18:06
merge()是C++标准库的函数,主要实现函数的排序和合并,不仅仅是合并,具体要求参照标准库。
#include"stdafx.h"
#include<iostream>
#include<algorithm>
#include<array>
#include<list>
usingnamespacestd;
boolcomp(constinti,constintj){
returni>j;
}
intmain(void){
/*自定义谓词*/
std::array<int,4>ai1={1,3,4,5};
std::list<int>lsti1;
for(constauto&i:ai1)
lsti1.push_front(i);//从大到小
std::array<int,4>ai2={2,6,7,8};
std::list<int>lsti2;
for(constauto&i:ai2)
lsti2.push_front(i);
lsti1.merge(lsti2,comp);
std::cout<<"merge(>):";
for(constauto&i:lsti1)
std::cout<<i<<"";
std::cout<<std::endl;
/*默认谓词*/
std::array<int,4>ai1d={1,3,4,5};
std::list<int>lsti1d;
for(constauto&i:ai1d)
lsti1d.push_back(i);//从小到大
std::array<int,4>ai2d={2,6,7,8};
std::list<int>lsti2d;
for(constauto&i:ai2d)
lsti2d.push_back(i);
lsti1d.merge(lsti2d);
std::cout<<"merge(<):";
for(constauto&i:lsti1d)
std::cout<<i<<"";
std::cout<<std::endl;
return0;
}
扩展资料
Merge算法的两种接口,把两个有序的数组合并到另一个数组中:
void Merge(int *A, int f, int m, int e){
int temp[e-f+1];
int i,first=f,last=m+1;
for(i=0;i<(e-first+1)&&f<=m&&last<=e;i++){
if(A[f]<=A[last]) {
temp[i]=A[f];
f++;
}
else {
temp[i]=A[last];
last++;
}
}
while(f>m&&last<=e){
temp[i]=A[last];
i++;
last++;
}
while(f<=m&&last>e){
temp[i]=A[f];
i++;
f++;
}
for(i=0;first<=e;i++,first++){
A[first]=temp[i];
}
}
参考资料来源:百度百科—c语言
热心网友
时间:2022-05-03 19:24
并不是说类型不匹配,是因为在使用merge之前未定义,把merge放到mergeSor前面,或是在最开始写上这句:
void merge(int*,int,int,int);
希望对你能有所帮助。
热心网友
时间:2022-05-03 20:59
在C语言中,merge.c实现的是合并的方法
一、归并排序算法
算法的递推关系:一个大的数列需要排序,把它从中间分成两部分,每一部分归并排序,然后把排好序的这两个部分再合并起来(合并的时候要按顺序合并)。
算法的Base Case:如果分成的这部分只有一个数,那么这个部分就不用再排序(看做已经排好序的)。
实现这个算法用了三个函数,每个函数在一个文件中,分别为:merge.c sort.c 和 main.c,其中merge.c实现的是合并的方法,sort.c实现的是排序的方法,main.c是一个测试实例。还有三个头文件,分别指出了函数原型。
merge.c:
/*This is a merge program.
* Given an integer ARRAY and three numbers which indicate the begain
*and the end of two subarrays, merge the two subarrays to a bigger
*one. The two subarrays are alrealy sorted from small to big.
* For example, given an array a[10] and three numbers 0, 3 and 5. The
*first array is from a[0] to a[2], the seconde array is from a[3] to
*a[4]. The number 3 and 5 are the upper side. This program merge the
*two arrays together.
*
*Author: Eric
*Time: 2011.01.08
*/
#include <stdio.h>
#include <stdlib.h>
#include "main.h"
void merge(int *a, int idxa, int idxb, int idxc)
{
int i = idxa, j = idxb, k = 0;
int total = idxc-idxa;
//int temp[total] = {0};
int *temp = (int *)malloc(sizeof(int) * total);
if(temp == NULL)
{
fprintf(stderr, "malloc error in merge function\n");
return;
}
while(i < idxb && j < idxc)
{
if(a[i] < a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
if(i == idxb)
{
while(j < idxc)
temp[k++] = a[j++];
}
else if(j == idxc)
{
while(i < idxb)
temp[k++] = a[i++];
}
/*Copy the temp to the sorce array*/
for(i = 0, k = idxa; i < total; k++, i++)
a[k] = temp[i];
free(temp);
}
#ifndef MAIN
/*For test*/
int main()
{
int a[10];
int i = 0;
int idxa=1, idxb=5, idxc=8;
printf("Please input 10 numbers to the array:");
for(i = 0; i < 10; i++)
scanf("%d", &a[i]);
printf("Three indexes are %d, %d and %d.\nThe first subarray is:", idxa, idxb, idxc);
for(i = idxa; i < idxb; i++)
printf(" %d", a[i]);
printf("\nThe second subarray is:");
for(i = idxb; i < idxc; i++)
printf(" %d", a[i]);
printf("\n");
merge(a, idxa, idxb, idxc);
printf("The merged array is:");
for(i = idxa; i < idxc; i++)
printf(" %d", a[i]);
printf("\n");
return 0;
}
#endif
merge.h:
/*Author: Eric
*Time: 2011.01.08
*/
void merge(int *a, int idxa, int idxb, int idxc);
sort.c:
/*This is a function for sorting an array useing merge.c
*
*Author: Eric
*Time: 2011.01.08
*/
#include <stdio.h>
#include "main.h"
#include "merge.h"
/*Sort array a, from a[begin] to a[upend-1]*/
void sort(int *a, int begin, int upend)
{
int n = upend - begin; /*the number to be sorted*/
/*The first array is a[idxa] to a[idxb-1]. The second is a[idxb] to a[idxc-1]*/
int idxa = begin,
idxb = ((begin+upend)%2 == 0) ? (begin+upend)/2 : (begin+upend+1)/2,
idxc = upend;
if(n < 2)
{
printf("The array elements are less than two. No need to sort\n");
return;
}
else if(n == 2)
merge(a, idxa, idxb, idxc);
else
{
if(idxb-idxa > 1)
sort(a, idxa, idxb);
if(idxc-idxb > 1)
sort(a, idxb, idxc);
merge(a, idxa, idxb, idxc);
}
}
#ifndef MAIN
#define MAIN
/*For test*/
int main()
{
int a[10] = {1, 4, 8, 5, 10, 25, 54, 15, 12, 2};
int i = 0;
sort(a, 0, 10);
printf("The sorted array is:");
for(i = 0; i < 10; i++)
printf(" %d", a[i]);
printf("\n");
return 0;
}
#endif