ImageVerifierCode 换一换
格式:DOCX , 页数:34 ,大小:40.77KB ,
资源ID:22154255      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/22154255.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(中国数学建模编程交流组合算法概论Word文档下载推荐.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

中国数学建模编程交流组合算法概论Word文档下载推荐.docx

1、单纯形法是按照一定的规则,从可行解集的一个顶点转移到另一个顶点,使得目标函数的值不断地得到改进,最后达到最优。尽管单纯形法一直使用得很好,但是在最坏情况下它需要指数运行时间,从而使线性规划问题是否属于P类一度成为人们关心的问题。后来的椭球算法和投影算法都很好的解决了这个问题。 排序和检索: 这两部分应当是大家比较熟悉的,所谓排序,就是将给定的元素序列按照某种顺序关系重新排列成有序序列。例如将n个数组成的序列按照从小到大的顺序重新排列;将n个英语单词组成的的序列按照字典顺序重新排列。所谓检索,就是在给定的集合中查找某个特定的元素或是元素组。排序和检索已经成为计算机科学技术中最基本、使用最频繁的算

2、法。下面我们专门谈谈排序算法(sorting algorithm)。 在讨论此种算法时,数据通常是指由若干记录组成的文件,每个记录包含一个或多个数据项,其中能够标志该记录的数据项称为键码。给定一文件的n个记录R1,R2,Rn及其相应的键码的集合K1,K2,Kn。所谓排序算法就是在数据处理中将文件中的记录按键码的一定次序要求排列起来的算法。若待排序的文件能够同时装入计算机的主存中,整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序;若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,有一部分必须放在外存上,则称此类排序问题为外部排序。当待排序的文件中包含有一些相同键码的记

3、录时,如果经过排序后这些相同的键码的记录的相对次序仍然保持不变,则相应的排序算法是稳定的,否则为不稳定的。如果排序算法设计成单处理机完成的,则此排序算法称为串行(或顺序)排序算法;如果排序算法时设计成多处理机实现的,则称为并行排序算法。 首先谈谈内部排序:内部排序的过程是一个逐步扩大记录的有序序列长度的过程。在排序的过程中,参与排序的记录序列中存在两个区域:有序区和无序区。 使有序区中记录的数目增加一个或几个的操作称为一趟排序。 逐步扩大记录有序序列长度的方法大致有下列几类: 一插入排序 假设在排序过程中,记录序列R1.n的状态为: 则一趟直接插入排序的基本思想为:将记录R 插入到有序子序列R

4、1.i-1中,使记录的有序序列从R1.i-1变为R1.i。 显然,完成这个“插入”需分三步进行: 1查找R的插入位置j+1; 2将Rj+1.i-1中的记录后移一个位置; 3将R复制到Rj+1的位置上。 I直接插入排序 利用顺序查找实现“在R1.i-1中查找R的插入位置”的插入排序。 注意直接插入排序算法的三个要点: 1从Ri-1起向前进行顺序查找,监视哨设置在R0; R0 = R; / 设置“哨兵” for (j=i-1; R0.keyRj.key; -j); / 从后往前找 return j+1; / 返回R的插入位置为j+1 2对于在查找过程中找到的那些关键字不小于R.key的记录,可以在

5、查找的同时实现向后移动; Rj+1 = Rj 3i = 2,3,, n, 实现整个序列的排序。 template void InsertionSort ( Elem R, int n) / 对记录序列R1.n作直接插入排序。 for ( i=2; i=n; +i ) / 复制为监视哨 for ( j=i-1; R0.key Rj.key; -j ) Rj+1 = Rj; / 记录后移 Rj+1 = R0; / 插入到正确位置 / InsertSort 时间分析: 实现排序的基本操作有两个: (1)“比较”序列中两个关键字的大小; (2)“移动”记录。 对于直接插入排序: II折半插入排序 因为

6、R1.i-1是一个按关键字有序的有序序列,则可以利用折半查找实现“在R1.i-1中查找R的插入位置”,如此实现的插入排序为折半插入排序。其算法如下: void BiInsertionSort (Elem R, int n) / 对记录序列R1.n作折半插入排序。=L.length; / 将R暂存到R0 low = 1; high = i-1; while (low=high) /在Rlow.high中折半查找插入的位置 m = (low+high)/2; / 折半 if (R0.key =high+1; Rhigh+1 = R0; / 插入 / BInsertSort 折半插入排序比直接插入排

7、序明显地减少了关键字间的“比较”次数,但记录“移动”的次数不变。 III表插入排序 为了减少在排序过程中进行的“移动”记录的操作,必须改变排序过程中采用的存储结构。利用静态链表进行排序,并在排序完成之后,一次性地调整各个记录相互之间的位置,即将每个记录都调整到它们所应该在的位置上。 算法描述如下: void LInsertionSort (Elem SL, int n) / 对记录序列SL1.n作表插入排序。 SL0.key = MAXINT ; SL0.next = 1; SL1.next = 0; for ( j=0, k = SL0.next; SLk.key = SL.key ; j

8、= k, k = SLk.next ) SLj.next = i; SL.next = k; / 结点i插入在结点j和结点k之间 / LinsertionSort 关于如在排序之后调整记录序列: 算法中使用了三个指针: 其中:p指示第i个记录的当前位置; i指示第i个记录应在的位置; q指示第i+1个记录的当前位置 void Arrange ( SLinkListType SL , int n ) / 根据静态链表SL中各结点的指针值调整 / 记录位置,使得SL中记录按关键字非递减 / 有序顺序排列 p = SL0.next;/ p指示第一个记录的当前位置 for ( i=1;n; +i )

9、/ SL1.i-1中记录已按关键字有序排列, / 第i个记录在SL中的当前位置应不小于i while (pi) p = SLp.next; / 找到第i个记录,并用p指示 / 其在SL中当前位置 q = SLp.next; / q指示尚未调整的表尾 if ( p!= i ) SLpSL; / 交换记录,使第i个 / 记录到位 SL.next = p; / 指向被移走的记录, / 使得以后可由while循环找回 p = q; / p指示尚未调整的表尾, / 为找第i+1个记录作准备 / Arrange 二 交换排序 通过“交换”无序序列中的记录从而得到其中关键字最小或最大的记录,并将它加入到有序

10、子序列中,以此方法增加记录的有序子序列的长度; I起泡排序 n-i+1 则第i趟起泡插入排序的基本思想为:借助对无序序列中的记录进行“交换”的操作,将无序序列中关键字最大的记录“交换”到Rn-i+1的位置上。 算法描述: template 1) lastExchangeIndex = 1; for (j = 1; j i; j+) if (Aj+1 =pivotkey) -high; RlowRhigh; / 将比枢轴记录小的记录交换到低端 Rlow.key +low; / 将比枢轴记录大的记录交换到高端 return low; / 返回枢轴所在位置 / Partition 容易看出,调整过程

11、中的枢轴位置并不重要,因此,为了减少记录的移动次数,应先将枢轴记录“移出”,待求得枢轴记录应在的位置之后(此时low=high),再将枢轴记录到位。 将上述“一次划分”的算法改写如下: /枢轴记录到位,并返回其所在位置,此时, R0 = Rlow; / 枢轴记录关键字 while (low high) while(low=pivotkey) Rlow = Rhigh; / 将比枢轴记录小的记录移到低端 Rhigh = Rlow; / 将比枢轴记录大的记录移到高端 Rlow = R0; / 枢轴记录到位 / 返回枢轴位置 III快速排序 在对无序序列中记录进行了一次分割之后,分别对分割所得两个子

12、序列进行快速排序,依次类推,直至每个子序列中只含一个记录为止。 快速排序的算法描述如下: void QSort (Elem R, int low, int high) / 对记录序列Rlow.high进行快速排序 if (low 0; -i ) / 把R1.n建成大顶堆 HeapAdjust ( R, i, n ); for ( i=n;1; -i ) R1R; / 将堆顶记录和当前未经排序子序列 / R1.i中最后一个记录相互交换 HeapAdjust(R, 1, i-1); / 将R1.i-1 重新调整为大顶堆 / HeapSort 其中筛选的算法如下所示。为将Rs.m调整为“大顶堆”,算

13、法中“筛选”应沿关键字较大的孩子结点向下进行。 Template void HeapAdjust (Elem R, int s, int m) / 已知Rs.m中记录的关键字除Rs.key之 / 外均满足堆的定义,本函数调整Rs 的关 / 键字,使Rs.m成为一个大顶堆(对其中 / 记录的关键字而言) rc = Rs; for ( j=2*s; j= Rj.key ) break; / rc应插入在位置s上 Rs = Rj; s = j; Rs = rc; / HeapAdjust 堆排序的时间复杂度分析: 1. 对深度为k的堆,“筛选”所需进行的关键字比较的次数至多为2(k-1); 2对n个关键字,建成深度为h(=&log2n&+1)的堆,所需进行的关键字比较的次数至多为4n; 3. 调整“堆顶”n-1次,总共进行的关键字比较的次数不超过 2(log2(n-1)&+ &log2(n-2)&+ +log22)2n(&) 因此,堆排序的时

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1