贪心算法最优合并问题



最优合并问题

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

分析:

次数最多:总是最长的两个先合并
次数最少:总是最短的两个先合并

#include<stdio.h>
#include<stdlib.h>

int cmp1(const void *a,const void *b){
    return *(int *)a-*(int *)b;//升序 
} 
int cmp2(const void *a,const void *b){
    return *(int *)b-*(int *)a;//降序 
} 

int main(){
    int n;//序列数
    scanf("%d",&n);
    int p[n],p1[n];
    int times=0;

    for(int i=0;i<n;i++){
        scanf("%d",&p[i]);
        p1[i]=p[i];
    } 
    
    for(int i=0;i<n-1;i++){
        qsort(p,n,sizeof(int),cmp1);
        p[0]=p[0]+p[1];
        times+=p[0]-1;
        p[1]=100000;
    } 
    printf("最少次数:%d\n",times);
    
    times=0;
    for(int i=0;i<n-1;i++){
        qsort(p1,n,sizeof(int),cmp2);
        p1[0]=p1[0]+p1[1];
        times+=p1[0]-1;
        p1[1]=0;
    } 
    printf("最多次数:%d\n",times);
    
    return 0;
}
运行截图
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,882评论 0赞 15
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 5,456评论 0赞 12
  • 概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的...
    Luc_阅读 2,411评论 0赞 35
  • 在人的一生中,工作绝对占据了人们大部分的时光。可能对于有些人而言,工作就是朝九晚六,工作就是不知疲倦的重复,工作就...
    imruxin阅读 3,082评论 2赞 18
  • 梦 梦的目的就是留下一些感觉,就是支持生活样式抵制来自常识的要求。 梦是想在个人生活样式与他当前面临的问题之间建立...
    佐缪阅读 186评论 0赞 0

友情链接更多精彩内容