算法:
1、直接插入排序
详解:https://blog.csdn.net/qq_44616044/article/details/115708056
void insertSort(int data[],int n){
int i,j,temp;
for(i=1;i<n;i++){
if(data[i]<data[i-1]){
temp = data[i];
data[i] = data[i-1];
for(j=i-1;j>=0&&data[j]>temp;j--){
data[j+1]=data[j];
}
data[j+1] = temp;
}
}
}
2、冒泡排序(每一趟排序能确定一个元素的最终位置)
详解:https://blog.csdn.net/Iseno_V/article/details/92212124
void bubbleSort(int arr[],int len){
int i,j,temp;
for(i=0;i<len-1;i++){
for(j=0;j<len-1-i;j++){
if(arr[j]>arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
3、简单选择排序
详解:https://blog.csdn.net/lemonchi/article/details/81364424
void selectSort(int data[],int n){
for(int i=0;i<n-1;i++){
int minIndex = i;
for (int j=i+1;j<n;j++){
if(data[j]<data[minIndex]){
minIndex = j;
}
}
if(minIndex!=i){
int temp = data[i];
data[i] = data[minIndex];
data[minIndex] = temp;
}
}
}
4、希尔排序
void shellSort(int data[],int n){
int *delta,k,i,t,dk,j;
k = n;
delta = (int*)malloc(sizeof(int)*(n/2));
i=0;
do{
k = k/2;
delta[i++] = k;
}while(k>1);
i=0;
while((dk=delta[i]>0){
for(k=delta[i];k<n;++k){
if(data[k]<data[k-dk]){
t = data[k];
for(j =k-dk;j>=0&&t<data[j];j-=dk){
data[j+dk] = data[j];
}
data[j+dk]=t;
}
}
++i;
}
}
5、快速排序
详解:https://blog.csdn.net/alzzw/article/details/97970371
void quickSort(int a[],int l,int r){
if(l>=r) return ;
int i=1;j=r;pivot=a[l];
while(i<j){
while(i<j&&a[j]>=pivot)j--;
a[i]=a[j];
while(i<j&&a[i]<=pivot)i++;
a[j]=a[i];
}
a[i]=pivot;
quickSort(a,l,i-1);
quickSort(a,i+1,r);
}
排序算法比较
面向对象
设计模式意图
1、创建型类
工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类;
2、创建型对象
抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类;
生成器:当一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;
原型:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象;
单例:保证一个类仅有一个实例,并提供一个访问它的全局访问点;
3、结构型类/对象
适配器:将一个类的接口转换成客户希望的另一个接口;使得原本由于接口不兼容而不能一起工作的那些类可以一起工作;
4、结构型对象
桥接:将抽象部分与其实现部分分离,使他们可以独立地变化;
组合:将对象组合成树形结构以表示“部分-整体”的层次结构。使得用户对单个对象和组合对象的使用具有一致性;
装饰器:动态地给一个对象添加一些额外的职责;
外观:为子系统的一组接口提供一个一致的界面;
享元:运用共享技术有效地支持大量细粒度对象;
代理:为其他对象提供一种代理以控制对这个对象的访问;
5、行为型类
解释器:给定一个语言,定义他的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子;
模板方法:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的特定步骤;
6、行为型对象
责任链:使多个对象都有机会处理请求 ,从而避免请求的发送者和接受者之间的耦合关系;
命令:将一个请求封装成一个对象,从而使得可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作;
迭代器:提供一种方法顺序访问一个聚合对象的各个元素,且不需要暴露该对象的内部表示;
中介者:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互;
备忘录:在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可以将对象恢复到原先保存的状态;
观察者:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新;
状态:允许一个对象在其内部状态改变时改变他的行为。对象看起来似乎修改了他的类。
策略:定义一系列的算法,把他们一个个封装起来,并且使他们可以相互替换。此模式使得算法可以独立于使用他们的客户而变化;
访问者:表示一个作用于某对象结构中的各元素的操作。它允许在不改变各元素的类的前提下定义作用于这些元素的新操作。
面向对象基础
面向对象分析的活动 :认定对象、组织对象、描述对象间的相互作用、确定对象的操作、定义对象的内部信息。
面向对象设计的活动:识别类及对象、定义属性、定义服务、识别关系、识别包。
面向对象设计的原则:
单一责任:就一个类而言,应该仅有一个引起它变化的原因
开放封闭:对扩展开放,对修改封闭
里氏替换:子类必须能够替换掉他们的基类型
依赖倒置:抽象不应该依赖于细节,细节应该依赖于抽象
接口分离:接口属于客户。依赖于抽象,不依赖于具体
共同封闭:包中所有类对于同一性质的变化应该是共同封闭的
共同重用:一个包中的所有类应该是共同重用的
软件过程模型
瀑布模型:线性顺序、文档驱动、适合软件需求很明确的项目;优点:容易理解,管理成本低;缺点:集成和测试堆到最后。
增量模型:强调每一个增量均发布一个可操作的产品,可以初始快速构建核心产品。优点:具备瀑布模型所有优点,第一个可交付版本的成本和时间很少,小系统风险不大;缺点:增量不稳定,管理发生的成本、进度和配置的复杂性可能会超出组织的能力。
原型模型:适合于用户需求不清、需求经常发生变化的情况;不适合大规模、复杂的软件;
螺旋模型:将瀑布模型和演化模型结合起来,加入风险分析,适用于庞大、复杂且 具有高风险的系统;支持用户需求的动态变化;开发人员需具有风险知识和经验;过多的迭代次数会增加开发成本,延迟提交时间。
喷泉模型:以对象作为驱动,使开发过程具有迭代性和无间隙性(开发活动无明显边界),在迭代过程中不断的完善系统,允许各开发活动交叉、迭代地进行。优点:提高开发效率、节省开发时间。缺点:需要大量开发人员、不利于项目管理、需要严格管理文档。
敏捷方法
极限编程:四大价值观(沟通、简单性、反馈、勇气)12个最佳实践(计划游戏、小型发布【系统的设计要能够尽可能早地交付】、隐喻、简单设计、测试先行、重构、结对编程、集体代码所有制、持续集成【可以按日甚至按小时为客户提供可运行的版本】、每周工作40个小时、现场客和编码标准)
水晶法:认为每一个不同的项目都需要一套不同的策略、约定和方法论;
并列争求法:使用迭代的方法,把每30天的一个迭代称为一个“冲刺”
敏捷统一过程:在大型上连续、在小型上迭代,采用经典的UP阶段性活动,能够使团队为软件项目构想成一个全面的工作流。
软件测试
软件测试目的:发现错误;
对应关系:
系统测试——需求分析
集成测试——总体设计
单元测试——详细设计
McCabe环路复杂度:有向弧数-节点数+2/ 闭合区间+1
可维护性评价指标:可理解性、可测试性、可修改性
软件维护的几个方面:
正确性维护:改正错误
适应性维护:适应信息技术变化和管理需求变化
完善性维护:扩充功能、改善性能
预防性维护:适应未来软硬件环境的变化,主动增加预防性的新的功能
计算公式:
可靠性(MTTF/(1+MTTF),MTTF为平均无故障时间)、可用性(MTBF/(1+MTBF),MTBF为失效间隔时间)、可维护性(1/(1+MTTR),MTTR为平均修复时间)
COCOMO估算模型
基本COCOMO模型:静态单变量模型,用于将整个软件系统进行估算
中级COCOMO模型:静态多变量模型,将软件系统模型分为系统和部件两个层次
详细COCOMO模型:将软件系统模型分为系统、子系统和模块3个层次
程序设计语言_编译过程
词法分析:
输入:源程序
输出:记号流
作用:分析构成程序的字符以及由字符按照构造规则构成的符号是否符合程序语言的规定
语法分析:
输入:记号流
输出:语法树/分析树
作用:对各条语句的结构进行合法性分析,分析程序中的句子结构是否正确
语义分析:
输入:语法树/分析树
作用:类型分析和检查,只能发现所有静态语义错误
中间代码生成
常见的中间代码:后缀式、三地址码、三元式、四元式、树
与具体的机器无关,可以将不同的高级程序语言编译成一种中间代码,中间代码可以跨平台、有利于进行与机器无关的优化处理和提高编译程序的可移植性
代码优化:
目标代码生成:
与具体的机器密切相关,寄存器的分配工作在这个阶段
C语言:预处理、编译、汇编、链接
有限自动机:词法分析的一个工具,能正确地识别正规集
确定的有限自动机(DFA):对每一个状态来说识别字符后转移地状态是唯一的
不确定的有限自动机(NFA):对每一个状态来说识别字符后转移的状态是不确定的
计算机网络
TCP:可靠的、面向连接的、差错校验和重传、流量控制(采用可变大小的滑动窗口协议)、拥塞控制、端口寻址、三次握手;
UDP:不可靠 、无连接、端口寻址、可以保证应用程序进程间的通信、开销较小
SMTP:Email系统基于客户端/服务器模式,服务器采用SMTP发生邮件,POP3接收邮件
ARP地址解析协议:IP地址转物理地址(MAC),以广播方式发送请求,单播传送响应
RARP反地址解析协议:物理地址(MAC)转IP地址,以广播方式发送请求,单播传送响应
DHCP:
功能:集中管理、分配IP地址、使网络环境中的主机动态获得IP地址、网关地址、DNS服务器地址等信息,并能提升地址的使用率;
DHCP客户端可以从DHCP服务器获得本机IP地址、DNS服务器地址、DHCP服务器地址和默认网关地址;
Windows无效地址:169.254.X.X
Linux无效地址:0.0.0.0
DHCP信息租用失败时自动给客户机分配的IP地址:169.254.X.X
URL:协议名://主机名.域名.域名后缀.目录名.网页文件名
DNS域名查询的次序:本地hosts文件,本地DNS缓存,本地DNS服务器,根域名服务器
主域名服务器接收到域名请求后查询顺序:本地缓存、本地hosts文件、本地数据库,转发域名服务器
HTTP一次请求过程顺序:
在浏览器中输入URL
浏览器向DNS服务器发出域名解析请求并获得结果
根据目的IP地址和端口号,与服务器建立TCP连接
浏览器向服务器发送数据请求
服务器将网页数据发送给浏览器
通信完成,断开TCP连接
浏览器解析收到的数据并显示
CMD命令
ipconfig/release:DHCP客户端手动释放IP地址
ipconfig/flushdns:清除本地DNS缓存内容
ipconfig/displaydns:显示本地DNS内容
ipconfig/registerdns:DNS客户端手动向服务器进行注册
ipconfig:显示所有网络适配器的IP地址,子网掩码和缺省网关值
ipconfig/all:显示所有网络适配器的完整TCP/IP配置信息,包括DHCP服务器是否已启动
ping:检查网络是否连通
netstat:显示网络相关信息
msconfig:windows配置的应用程序