给定k个排好序的序列s1,s2,…,sk,用2路合并算法将这k个序列合并成一个序列。
假设所采用的2路合并算法合并两个长度分别为m和n的序列需要m+n-1次比较。
试设计一个算法确定合并这个序列的最优合并顺序,使所需要的总比较次数最少。
测试用例: 4(序列数)
5 12 11 2(序列中的元素数)
输出: 78(最差情况) 52(最优情况)
#include<stdio.h>
#include<algorithm>
using namespace std;
int cmp(int a,int b){
return a>b;
}
int minSc(int *a,int m){
int b[m];//vc++中用这个int *b=new int [m];
int sum=0;
for(int i=0;i<m;i++)
{
b[i]=a[i];
}
while(m>1)
{
sort(b,b+m);
b[0]=b[1]+b[0]; //b[0]的值已经改变,在排序
sum+=b[0]-1;
for(int i=1;i<m-1;i++)
b[i]=b[i+1];
m--;
}
return sum;
}
int maxSc(int *a,int m){
int b[m];
int sum=0;
for(int i=0;i<m;i++)
{
b[i]=a[i];
}
while(m>1)
{
sort(b,b+m,cmp);
b[0]=b[1]+b[0]; //b[0]的值已经改变,在排序
sum+=b[0]-1;
for(int i=1;i<m-1;i++)
b[i]=b[i+1];
m--;
}
return sum;
}
int main (){
int n=4;
int a[4]={5,12,11,2};
printf("最优合并问题的最少比较次数为:%d\n",minSc(a,n));
printf("最优合并问题的最多比较次数为:%d\n",maxSc(a,n));
return 0;
}