算法 最优合并问题

来源:互联网 发布:零基础网络美术培训班 编辑:程序博客网 时间:2024/06/05 02:39

题目

给定k个排好序的序列s1,s2,…,sk,用2路合并算法将这k个序列合并成一个序列。
假设所采用的2路合并算法合并两个长度分别为m和n的序列需要m+n-1次比较。
试设计一个算法确定合并这个序列的最优合并顺序,使所需要的总比较次数最少。
测试用例: 4(序列数)
5 12 11 2(序列中的元素数)
输出:78(最差情况)\52(最优情况)


分析

贪心算法


#include<stdio.h>#define n 4int a[n]={5,12,11,2};int getmin(int *a){    int number=n,result=0,s[n];    int i,j,temp;    for(i=0; i<n; i++){        s[i]=a[i];    }    while(number>1){        for(i=0;i<number;i++){            for(j=i+1;j<number;j++){                if(s[i]>s[j]){                    temp=s[i];s[i]=s[j];s[j]=temp;                }            }        }        s[0]=s[0]+s[1];        result+=s[0]-1;        number--;        for(i=1;i<number;i++)            s[i]=s[i+1];    }    return result;}int getmax(int *a){    int number=n,result=0,s[n];    int i,j,temp;    for(i=0;i<n;i++){        s[i]=a[i];    }    while(number>1){        for(i=0;i<number;i++){            for(j=i+1;j<number;j++){                if(s[i]<s[j]){                    temp=s[i];s[i]=s[j];s[j]=temp;                }            }        }        s[0]=s[0]+s[1];        result+=s[0]-1;        number--;        for(i=1;i<number;i++)            s[i]=s[i+1];    }    return result;}int main(){    printf("最优情况:%d\n",getmin(a));      printf("最差情况:%d\n",getmax(a));    return 0;}
0 0