• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言实现最大间隙问题实例

C语言实现最大间隙问题实例

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c语言编程实例题,c语言高级编程实例,c语言应用实例,c语言游戏编程实例,c语言编程实例等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文实例展示了C语言实现最大间隙问题的方法,对于算法的设计有一定的借鉴价值。分享给大家供大家参考。具体如下:

问题描述如下:

给定n个实数x1,x2,...,xn,求这n个实数在实轴上相邻2个数之间的最大差值,要求设计线性的时间算法。

解决思路:

注意题中要求设计线性时间算法。如果没有这个要求,就可以先排序,找出来就很方便。但我们知道排序最优良的算法的时间效率也是nlogn的。所以不可行。

采用一种区间算法。具体步骤就不说了,给出C语言代码,有注释加以说明。

具体实现代码如下:

#include "stdio.h"
#include "stdlib.h"
#define MAX 10000
float findmin(float data[],int n){/*寻找数据序列中的最小值*/
   int index,i;
   float min,temp;
   temp=data[0];
   for(i=1;i<n;i++){
     if(data[i]<temp){
       temp=data[i];
       index=i;
     }
   }
   min=data[index];
   return min;
}
float findmax(float data[],int n){/*寻找数据序列中的最大值*/
   int index,i;
   float max,temp;
   temp=data[0];
   for(i=1;i<n;i++){
     if(data[i]>temp){
       temp=data[i];
       index=i;
     }
   }
   max=data[index];
   return max;
}
void initial(int n,int count[],float low[],float high[],float min,float max){/*初始化区间*/
   int i;
   for(i=0;i<n;i++){
     count[i]=0; //区间是否有数据存入 
     low[i]=max; //将区间的左端赋值最大值 
     high[i]=min; //将区间的右端复制最小值 
   }
}
void dataIn(float m,int count[],float low[],float high[],int n,float data[],float min){/*将数据序列依次放入对应区间*/
   int i,location;
   for(i=0;i<n;i++){
     location=int((data[i]-min)/m)+1; //判断数据进入哪个区间:按照等分区间,数据与最小值的差与区间大小的比值+1就是区间编号 
     if(location==n)
       location--;
     count[location]++; //有数据存入,计数值加1 
     if(data[i]<low[location]) //如果数据比左端值小,则作为左端值 
       low[location]=data[i];
     if(data[i]>high[location]) //如果数据比右端值大,则作为右端值 
       high[location]=data[i];
   }
}
float findMaxGap(int n,float low[],float high[],int count[]){ /*找出最大间隙,整个问题的核心*/
/*函数说明*/
/*上面已经把对应数据放入相应的区间,在之前可以知道,总共有n-1区间,相应的只有n-2个值,那么就一定有一个区间不会有数据*/
/*因为最大值与最小值已经分别被设为最小区间的左端值和最大区间的右端值,所以中间的n-1区间只有n-2个值*/
/*那么可以想象,最大间隙肯定不会是在一个区间中,而一定是在空区间的两端,
最大间隙为空区间右边相邻区间的左端值空区间左边相邻区间的右端值;有可能有多个这种情况,找出最大就行了*/
   int i;
   float maxgap,dhigh,temp;
   dhigh=high[1];
   for(i=2;i<n;i++){
     if(count[i]){
       temp=low[i]-dhigh;
       if(maxgap<temp)
         maxgap=temp;
       dhigh=high[i];
     }
   } 
   return maxgap;
}
int main(){
  float data[MAX];
  int n,i=0;
  float min,max;
  float m,maxgap;
  float low[MAX],high[MAX];
  int count[MAX];
  scanf("%d",&n);
  for(i=0;i<n;i++)
    scanf("%f",&data[i]);
  min=findmin(data,n);
  max=findmax(data,n);
  m=(max-min)/(n-1);
  initial(n,count,low,high,min,max);
  dataIn(m,count,low,high,n,data,min);
  maxgap=findMaxGap(n,low,high,count);
  printf("%.1f",maxgap);
  system("pause");
  return 0;
}

</div>

感兴趣的朋友可以测试运行本文实例以加深理解。相信本文所述对大家C程序算法设计的学习有一定的借鉴价值。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C语言实现获取内存信息并输出的实例
  • c语言实现输入一组数自动从大到小排列的实例代码
  • 利用C语言实现顺序表的实例操作
  • C语言数据类型转换实例代码
  • C语言合并排序及实例代码
  • C 语言快速排序实例代码
  • C语言编写获取Linux本地目录及本机信息的小程序实例
  • C语言时间处理实例分享
  • C语言实现最大间隙问题实例
  • C语言连续子向量的最大和及时间度量实例

相关文章

  • 2017-05-28C++求逆序对的方法
  • 2017-05-28解析ActiveMQ的使用说明总结
  • 2017-05-28使用C语言实现CRC校验的方法
  • 2017-05-28c++中do{...}while(0)的意义和用法
  • 2017-05-28stl常用算法(Algorithms)介绍(stl排序算法、非变序型队列)
  • 2017-05-28C++类型转换归纳总结
  • 2017-05-28vc中使用SendMessage自定义消息函数
  • 2017-05-28C++中关于set删除的一些坑
  • 2017-05-28ipv6实现udp编程示例
  • 2017-05-28C实现的非阻塞方式命令行端口扫描器源码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 解析C++编程中的#include和条件编译
    • C++中overload,override,overwrite的区别详细解析
    • 详解C++编程中的嵌套类的声明与其中的函数使用
    • 使用C++描绘心形
    • C++非递归队列实现二叉树的广度优先遍历
    • .h和.cpp文件的区别(zt)详细介绍
    • visual studio 2015下boost库配置教程
    • C++多线程编程简单实例
    • C++ const引用、临时变量 引用参数详解
    • vc中SendMessage自定义消息函数用法实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有