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=0i<(e-first+1)&&f<=m&&last<=ei++){
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=0first<=ei++,first++){
A[first]=temp[i]
}
}
参考资料来源:百度百科—c语言
void MergeSort(int x[],int n) { //非递归归并排序//元素数组为x,其长度为n
int i,j,k1,k2,l
int *a
for(i=1i<=n-1i=i*2)//i为插入排序的子段长度
{
for(j=1j<=n-1j=j+2*i)//j为进行插入排序的子段起始位置
{
a=(int *)malloc(2*i*sizeof(int))
l=0k1=jk2=j+i
while((l<2*i)&&(k2<=n-1)&&(k2<j+2*i)&&(k1<j+i))
{//子段中,比较,移至辅助内存
if(x[k1]<x[k2])
{
a[l++]=x[k1]k1++
}
else
{
a[l++]=x[k2]k2++
}
}
if((k2>n-1)||(k2>=j+2*i))
{//子段的后一段超出数组范围
for(k1<j+ik1++)
a[l++]=x[k1]
}
else//就只有第一段就超数组了
{
if(k1>=j+i)
{
for((k2<j+2*i)&&(k2<=n-1)k2++)
a[l++]=x[k2]
}
}
for(k1=0k1<lk1++)//最后移位
{
x[j+k1]=a[k1]
}free(a)
}
}
}
非递归的归并排序,我以前写的。
中间malloc与free的话,是为了方便管理不定大小的空间,这里需要malloc.h的头文件