《2020年某工业大学C语言课程设计大作业.pdf》由会员分享,可在线阅读,更多相关《2020年某工业大学C语言课程设计大作业.pdf(113页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、西北工业大学C语言课程设计大作业学 院 电子信息学院班 级 08031302班学 号姓 名 张昌武摘要本次大作业包括一个标准型大作业,一个界面型大作业,两个数学型大作业和一个算法型大作业。本次联系我选择的题目是:A文档仅供参考,不当之处,请联系改正。数学型歌星大奖赛求最大数B标文档仅供参考,不当之外盘 处,请联系改正.一准型打印指定年份的公历表和农历表文档仅供参考,不当之处,请联系改正。算法型七种排序算法界面型P文档仅供参考,不当之处,请联系改正。enL图形库程序目录文档仅供参考,不当之处,请联系改正。1摘要.错误!未定义书签。1.1 设计题目错误!未定义书签。1.2 设计内容错误!未定义书签
2、。1.3 开发工具错误!未定义书签。1.4 应用平台错误!未定义书签。2详细设计.错误!未定义书签。2.1程序结构错误!未定义书签。2 2主要功能错误!未定义书签。2.3函数实现错误!未定义书签。24开发日志错误!未定义书签。3程序调试及运行.错误!未定义书签。3.1程序运行结果错误!未定义书签。3 3程序使用说明错误!未定义书签。3 3程序开发总结错误!未定义书签。文档仅供参考,不当之处,请联系改正。4附 件(源程序).错误!未定义书签。文档仅供参考,不当之处,请联系改正。1 摘要1.1 设计题目A.数学型a.歌星大奖赛b.求最大数B.标准型a.打印指定年份的公历表和农历表C 算法型a.七种
3、排序算法D.界面型a.OpenGL图形库程序1.2 设计内容A.数学型a.十个评委打分,分数在11 0 0 之间,选手最后得分为:去掉一个最高分和一个最低分后其余8 个分数的平均值。b.求 555555的约数中的最大三位数B.标准型a.打印指定年份的公历表和农历表文档仅供参考,不当之处,请联系改正。C.算法型乩七种排序算法:快速排序插入排序选择排序冒泡排序堆排序归并排序基数排序D.界面型a.OpenGL图形库程序:绘制黑白框绘制螺旋曲线绘制彩色立方体1.3 开发工具codeblock1.4 应用平台Windows/XP/Vista 32 位/win 7、8文档仅供参考,不当之处,请联系改正。2
4、详细设计2.1 程序结构A.数学型a.十个评委打分,分数在1 1 0 0 之间,选手最后得分为:去掉一个最高分和一个最低分后其余8 个分数的平均值。该题涉及到数组存储b.求 555555的约数中的最大三位数:该题只用到循环和判断语句,从 999向下搜索即可B.标准型a.打印指定年份的公历表和农历表年历的设计与计算,应首先判断“某年某月某日是星期几”,即能被4且不能被1 0 0 整除或能被4 0 0 整除的数。这样,接下来的事情就简单了,输入年份,打印出相应的日历。C 算法型a.七种排序算法:文档仅供参考,不当之处,请联系改正。快速排序(Quicksort)划分的关键是要求出基准记录所在的位置p
5、ivotpos,编程时候的关键点快速排序:既然能把冒泡K 0 掉,马上就激起我们的兴趣,tnd快排咋这么快,一定要好好研究一下。首先上图:20 40 50 10 60 20,11left right base从图中我们能够看到:left指针,right指针,base参照数。其实思想是蛮简单的,就是经过第一遍的遍历(让left和 right指针重合)来找到数组的切割点。第一步:首先我们从数组的left位置取出该数(2 0)作为基准(base)参照物。第二步:从数组的right位置向前找,一直找到比(base)小的数,如果找到,将此数赋给left位置(也就是将10赋给2 0),此时数组为:10,4
6、0,50,10,60,left和 right指针分别为前后的10.第三步:从数组的left位置向后找,一直找到比(base)大的数,如果找到,将此数赋给right的位置(也就是40赋给1 0),此时数组为:10,40,50,40,60,left和 right指针分别为前后的40.第四步:重复“第二,第三“步骤,直到left和 right指针重合,最后将(base)插入到40的位置,此时数组值为:10,20,50,40,6 0,至此完成一次排序。第五步:此时20已经潜入到数组的内部,20的左侧一组数都比20小,20的右侧作为一组数都比20大,以20为切入点对左右两边数按照”第一,第二,第三,第四
7、”步骤进行,最终快排大功告成。快速排序具有最好的平均性能(average behavior),但最坏性能(worst case behavior)和插入排序相同,也是0(n2)。比如一个序列5,4,3,2,1,要排为1,2,3,4,5。按照快速排序方法,每次只会有一个数据进入正确顺序,不能把数据分成大小相当的两份,很明显,排序的过程就成了一个歪脖子树,树的深度为n,那文档仅供参考,不当之处,请联系改正。时间复杂度就成了 0(11八2)。尽管如此,需要排序的情况几乎都是乱序的,自然性能就保证了。据书上的测试图来看,在数据量小于20的时候,插入排序具有最好的性能。当大于20时,快速排序具有最好的性
8、能,归并(mergesort)和堆排序(heap sort)也望尘莫及,尽管复杂度都为nlog2(n).1、算法思想快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,一般称其为分治法(Divide-and-ConquerMethod)。(1)分治法的基本思想分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。(2)快速排序的基本思想设当前待排序的无序区为Rlow.high,利用分治法可将快速排序的基本思想描述为:分解:在Rlow.high中任选一个记录作为基准(Pivot
9、),以此基准将当前无序区划分为左、右两个较小的子区间Rlow.pivotpos-1)和Rpivotpos+1.high,并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。注意:划分的关键是要求出基准记录所在的位置pivotpos.划分的结果能够简单地表示为(注意pivot=Rpivotpos):Rlow.pivotpos-1.keysRpivotpos.keyRpivotpos+1.high.keys其中
10、 lowpivotposhigh.求解:经过递归调用快速排序对左、右子区间Rlow.pivotpos-1和Rpivotpos+1.high快速排序。组合:因为当“求解”步骤中的两个递归调用结束时,其左、右两个子区间已有序。对快速排序而言,组合”步骤无须做什么,可看作是空操作。2、快速排序算法Quicksortv o i d Q u i c k s o r t(S eq L i s t R,i n t l o w,i n t h i g h)对R l o w.h i g h 快速排序i n t p i v o t p o s;划分后的基准记录的位置i f (l o wh i g h)仅当区间长度
11、大于1时才须排序p i v o t p o s=P a r t i t i o n (R,l o w,h i g h);对 R l o w.h i g h 做划分Q u i c k s o r t (R,l o w,p i v o t p o s-1);对左区间递归排序Q u i c k s o r t(R,p i v o t p o s+L h i g h);对右区间递归排序)/Q u i c k s o r t注意:为排序整个文件,只须调用Q u i c k s o r t (R,1,n)即可完成对R l.n 的排序。文档仅供参考,不当之处,请联系改正。插入排序算法描述插入排序,插入即表示
12、将一个新的数据插入到一个有序数组中,并继续保持有序.例如有一个长度为N的无序数组,进行N-1次的插入即能完成排序;第一次,数组第1个数认为是有序的数组,将数组第二个元素插入仅有1个有序的数组中;第二次,数组前两个元素组成有序的数组,将数组第三个元素插入由两个元素构成的有序数组中第 N-1次,数组前N-1个元素组成有序的数组,将数组的第N个元素插入由N-1个元素构成的有序数组中,则完成了整个插入排序。以下面5 个无序的数据为例:65 27 59 64 58(文中仅细化了第四次插入过程)第 1 次插入:27 65 59 64 58第 2 次插入:27 59 65 64 58第 3 次插入:27 5
13、9 64 65 58第 4 次插入:27 58 59 64 65第4次插入过程第4次插入时,前4个数据已经过成有序的数组,将数过第5个元素插入前面有序的数组中,过程如下图所示:囱 59 64 65 58|5827,继续比较27国64 65 58|5859,即找到58插入位置:第二个位置27 58 59 64 65|将 59,64,65后移一个位置,58插入在第二个位置二.算法分析平均时间复杂度:0(n2)空间复杂度:0(1)(用于记录需要插入的数据)稳定性:稳定选择排序算法描述选择排序:比如在一个长度为N 的无序数组中,在第一趟遍历N 个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下
14、的N-1 个数据,找出其中最小的数值与第二个元素交换第 N-1 趟遍历剩下的2个数据,找出其中最小的数值与第N-1 个元素交换,至此选择排序完成。文档仅供参考,不当之处,请联系改正。以下面5个无序的数据为例:56 12 80 91 20(文中仅细化了第一趟的选择过程)第 1 趟:12 56 80 91 20第一趟遍历选择最小数并交换国1 2 8 0 9 1 2 05 6 国8 0 9 1 2 05 6 1 2 圆 9 1 2 05 6 1 2 8 0叵 2 05 6 1 2 8 0 9 1 叵|最小数值索用:1最小数值索5:2最小数值索引:2最小数值索弓1:2最小数值索引:21 2 5 6 8
15、 0 9 1 2 0位置2叮位置1数据互换P S:索引即为敬据元素的位置.第 2 趟:12 20 80 91 56第 3 趟:12 20 56 91 80第 4 趟:12 20 56 80 91算法分析平均时间复杂度:O(n2)空间复杂度:0(1)(用于交换和记录索引)文档仅供参考,不当之处,请联系改正。稳定性:不 稳 定(比如序列 5,5,3】第一趟就将第一个 5与 3交换,导致第一个5挪动到第二个5后面)冒泡排序冒泡排序法的基本思想:(以升序为例)含有n个元素的数组原则上要进行n-l次排序。对于每一躺的排序,从第一个数开始,依次比较前一个数与后一个数的大小。如果前一个数比后一个数大,则进行
16、交换。这样一轮过后,最大的数将会出现称为最末位的数组元素。第二轮则去掉最后一个数,对前n-1个数再按照上面的步骤找出最大数,该数将称为倒数第二的数组元素.n-l轮过后,就完成了排序。若要以降序顺序排列,则只需将if(array j array j+l)语句中的大于号改为小于号即可。堆排序堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。文档仅供参考,不当之处,请联系改正。T.堆堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:Keyi=key2i+l&Keyi=Key2i+1&key=key2i+2即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。堆分为大顶堆和小顶堆,
17、满足Keyi=Key2i+l&key=key2i+2W为大顶堆,满足Keyi=key2i+l&Keyi=key2i+2称为小顶堆。由上述性质可知大顶堆的堆顶的关键字肯定是所有关键字中最大的,小顶堆的堆顶的关键字是所有关键字中最小的。2.堆排序的思想利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小关键字)这一特性,使得每次从无序中选择最大记录(最小记录)变得简单。文档仅供参考,不当之处,请联系改正。其基本思想为(大顶堆):工)将初始待排序关键字序列(RI,R2.Rn)构建成大顶堆,此堆为初始的无序区;2)将 堆 顶 元 素 与 最 后 一 个 元 素 Rn交换,此时得到新的无序区(R1,R2,R
18、n-1)和新的有序区(Rn),且满足 Rlz2.n-l=Rn;3)由于交换后新的堆顶可能违反堆的性质,因此需要对当前无序区(R1,R2,Rn-1)调整为新堆,然后再次将与无序区最后一个元素交换,得到新的无序区(R1,R2 Rn-2)和新的有序区(Rn-lfRn)o不断重复此过程直到有序区的元素个数为 n-1,则整个排序过程完成。操作过程如下:工)初始化堆:将 R1 n构造为堆;2)将当前无序区的堆顶元素同该区间的最后一个记录交换,然后将新的无序区调整为新的堆。因此对于堆排序,最重要的两个操作就是构造初始堆和调整堆,其实构造初始堆事实上也是调整堆的过程,只不过构造初始堆是对所有的非叶节点都进行调
19、整。文档仅供参考,不当之处,请联系改正。F面举例说明:给定一个整形数组a=1 6,7,32 0,1 7,8,对其进行堆排序。首先根据该数组元素构建一个完全二叉树,得到然后需要构造初始堆,则从最后一个非叶节点开始调整,调整过程如下:文档仅供参考,不当之处,请联系改正。2 0和1 6交换后导致1 6不满足堆的性质,因此需重新调整这样就得到了初始堆。即每次调整都是从父节点、左孩子节点、右孩子节点三者中选择最大者跟父节点进行交换(交换之后可能造成被交换的孩子节点不满足堆的性质,因此每次交换之后要重新对被交换的孩子节点进行调整)。有了初始堆之后就能够进行排序了。文档仅供参考,不当之处,请联系改正1/A
20、A(需调整继续调整此时3 位于堆顶不满堆的性质,则A/V 文档仅供参考,不当之处,请联系改正。这样整个区间便已经有序了。从上述过程可知,堆排序其实也是一种选择排序,是一种树形选择排序。只不过直接选择排序中,为了从中选择最大记录,需比较n-1 次,然后从R n-2 中选择最大记录需比较n-2 次。事实上这n-2 次比较中有很多已经在前面的n-1 次比较中已经做过,而树形选择排序恰好利用树形的特点保存了部分前面的比较结果,因此能够减少比较次数。对于n 个关键字序列,最坏情况下每个节点需比较Iog2(n)次,因此其最坏情况下时间复杂度为nlogn。堆排序为不稳定排序,不适合记录较少的排序。文档仅供参
21、考,不当之处,请联系改正。归并排序归并排序的基本操作是将两个或两个以上的记录有序序列归并为一个有序序列。最简单的情况是,只含一个记录的序列显然是个有序序列,经过“逐趟归并“使整个序列中的有序子序列的长度逐趟增大,直至整个记录序列为有序序列止。它的基本操作是将两个相邻的有序子序列“归并”为一个有序序列,如右侧所示。这个操作对顺序表而言是极其容易实现的,只要依关键字从小到大进行“复制”即可基数排序简略概述:基数排序是经过 分配 和 收集 过程来实现排序。而这个思想该如何理解呢?请看以下例子。(1)假设有欲排数据序列如下所示:73 22 93 43 55 14 28 65 39 81首先根据个位数的
22、数值,在遍历数据时将它们各自分配到编号。至 9 的 桶(个位数值与桶号一一对应)中。分配结果(逻辑想象)如下图所示:文档仅供参考,不当之处,请联系改正。018122237393434145556567828939分配结束后。接下来将所有桶中所盛数据按照桶号由小到大(桶中由顶至底)依次重新收集串起来,得到如下依然无序的数据序列:81 22 73 93 43 14 55 65 28 39接着,再进行一次分配,这次根据十位数值来分配(原理同上),分配结果(逻辑想象)如下图所示:文档仅供参考,不当之处,请联系改正。011422228339443555665773881993分配结束后。接下来再将所有桶
23、中所盛的数据(原理同上)依次重新收集串接起来,得到如下的数据序列:14 22 28 39 43 55 65 73 81 93观察能够看到,此时原无序数据序列已经排序完毕。如果排序的数据序列有三位数以上的数据,则重复进行以上的动作直至最高位数为止。那么,到这里为止,你觉得你是不是一个细心的人?不要不假思索的回答我。不论回答什么样的问题,都要做到心比头快,头比嘴快。仔细看看你对整个排序的过程中还有哪些疑惑?真看不到?觉得我做得很好?抑或前面没看懂?如果你看到这里真心没有意识到或发现这个问题,那我告诉你:悄悄去找个墙角蹲下用小拇指画圈 圈(好好反省反省)。追问:观察原无序数据序列中73 93 4 3
24、 三个数据的顺序,在经过第一次(按照个位数值,它们三者应该是在同一个桶中)分配之后,在桶中顺序由底至顶应该为73 93 43(即就是装的迟的在最上面,对应我们上面的逻辑想象应该是43 93 73),对吧?这个应该能够想明白吧?理论上应该是这样的。可是,可是,可是分配后很明显在3 号桶中三者的顺序刚好相反。这点难道你没有发现吗?或者是发现了觉得不屑谈及(算我贻笑大方)?其实这个也正是基数排序稳定性的原因(分配时由末位向首位进行),请看下文的详细分析。再思考一个问题:既然我们能够从最低位到最高位进行如此的分配收集,那么是否能够由最高位到最低位依次操作呢?答案是完全能够的。文档仅供参考,不当之处,请
25、联系改正。基于两种不同的排序顺序,我们将基数排序分为LSD(Least significant digital)MSD(Most significant digital),LSD的排序方式由数值的最右边(低位)开始,而 MSD则相反,由数值的最左边(高位)开始。注意一点:LSD的基数排序适用于位数少的数列,如果位数多的话,使 用 MSD的效率会比较好。MSD的方式与LSD相反,是由高位数为基底开始进行分配,但在分配之后并不马上合并回一个数组中,而是在每个 桶子 中建立 子桶,将每个桶子中的数值按照下一数位的值分配到 子桶”中。在进行完最低位数的分配后再合并回单一的数组中。(2)我们把扑克牌的排
26、序看成由花色和面值两个数据项组成的主关键字排序。要求如下:花色顺序:梅花方块红心黑桃面值顺序:234.10JQKA那么,若要将一副扑克牌排成下列次序:梅 花 2,,梅花A,方 块 2,,方块A,红 心 2,,红心A,黑桃2,,黑桃A。有两种排序方法:先按花色分成四堆,把各堆收集起来;然后对每堆按面值由小到大排列,再按花色从小到大按堆收叠起来。一一称为“最高位优先“(MSD)法。先按面值由小到大排列成13堆,然后从小到大收集起来;再按花色不同分成四堆,最后顺序收集起来。一一称为“最低位优先“(LSD)法。2 代码实现(1)MSD法实现最高位优先法一般是一个递归的过程:先根据最高位关键码K1排序,
27、得到若干对象组,对象组中每个对象都有相同关键码K L再分别对每组中对象根据关键码K2进行排序,按 K2值的不同,再分成若干个更小的子组,每个子组中的对象具有相同的K1和 K2值。依此重复,直到对关键码Kd完成排序为止。最后,把所有子组中的对象依次连接起来,就得到一个有序的对象序列。(2)LSD法实现最低位优先法首先依据最低位关键码Kd对所有对象进行一趟排序,再依据次低位关键码Kd-1对上一趟排序的结果再排序,依次重复,直到依据关键码K1最后一趟排序完成,就能够得到一个有序的序列。使用这种排序方法对每一个关键码进行排序时,不需要再分组,而是整个对象组。3 基数排序稳定性分析基数排序是稳定性排序算
28、法,那么,到底如何理解它所谓的稳定特性呢?比如:我们有如下欲排数据序列:下面选择LSD逻辑演示10 112312412文档仅供参考,不当之处,请联系改正。第一次按个位数值分配,结果如下图所示:0101312业2B123424然后收集数据结果如下:1031皿2耻224第二次按十位数值分配,结果如下图所示:0110耻2E122243314然后收集数据结果如下:10皿23122431注意:分配时是从欲排数据序列的末位开始进行,逐次分配至首位。D.界面型a.OpenGL图形库程序文档仅供参考,不当之处,请联系改正。openGL(Open Graphics Library)从本质上说,它是一个3 D图形
29、和模型库,具有高度的移植性。我们能够将openGL看做是一个C运行时的函数库,这个函数库能够帮助我们绘制二维或三维的图像。静态链接库和动态链接库静态库:lib文件。编译时代码编译进exe中,会使得程序体积非常庞大。不利于模块的共享。优点:不会有dllhell的问题。仿佛“企业间的吞并”。动态库:dll文件。代码在dll中,其它程序调用dll中的代码,多个程序能够共享。缺点:dll hell(dll地狱),版本问题。另外,主要用到的就是“ghit.h”这个头文件,它包括了我们所需的大多数函数,直接调用很方便!我们利用OpenGl函数库编写了三个简单的程序,分别是:绘制黑白框、绘制螺旋曲线、绘制彩
30、色立方体。2.2 主要功能A.数学型文档仅供参考,不当之处,请联系改正。a.十个评委打分,分数在1 1 0 0 之间,选手最后得分为:去掉一个最高分和一个最低分后其余8 个分数的平均值。该题主要实现赛场的积分统计b.求 555555的约数中的最大三位数该题主要实现一个数的约数的求解B.标准型a.打印指定年份的公历表和农历表该题主要实现制定年月日期的输出C 算法型a.七种排序算法:快速排序插入排序选择排序冒泡排序堆排序归并排序基数排序该题主要实现一组数据的排序D.界面型a.OpenGL图形库程序文档仅供参考,不当之处,请联系改正。该题主要实现OpenGl图形库在Windows系统下的图形设计/*
31、请在这里说明你的大作业程序功能,并详细描述它们实现的原理和方法(包含算法、数据结构)。*/2.3 函数实现B.标准型a.打印指定年份的公历表和农历表void DateTrans(char*chDate,int*nYear,int*nMonth,int*nDay)/1(*nYear=(chDate0-0)*1000+(chDatel-0)*100+(chDate2-,0,)*10+chDate3-,0,;*nMonth=(chDate5-,0,)*10+chDate6-,0,;nDay=(chDate8-,0,)*10+chDate9-,0,;)int IsLeapYear(int nYear)
32、文档仅供参考,不当之处,请联系改正。/2if(nYear%4=0)return 1;elsereturn 0;)int GetWeekOfFirstday(int nYear)/3if(nYear)return(nYear-)*365+(nYear-)/4+l)%7;else if(nYear)return 6-(-nYear)*365+(-nYear)/4)%7;elsereturn 6;)int GetWeek(int nYear,int nMonth,int nDay,intnWeekOfFirstday)/4文档仅供参考,不当之处,请联系改正。intnDaysYear=31,28,31
33、,30,31,30,31,31,30,31,30,31;intnDaysLeapYear=31,29,31,30,31,30,31,31,30,31,30,31;int i,sum=O;if(nYear%4=0)|for(i=0;i(nMonth-l);i+)|sum+=nDaysLeapYeari;)return(sum+nDay+nWeekOfFirstday-1)%7;)else(for(i=0;i(nMonth-l);i+)(sum+=nDaysYeari;)return(sum+nDay+n WeekOfFirstday-1)%7;文档仅供参考,不当之处,请联系改正。)void Pr
34、intCalendar(intnMonthDays,char*chDate)int i,j;printf(nthe calenderfollowing:iin);nWeek,int nDay,int/5of this month asprl ntA(/yf fv al*al*f f 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不4*n )printf(n SUN MON TUE WEN THU FRISTAnn);for(i=l,j=l;j=nMonthDays;i+)if(i=nWeek+l)printf(n);else
35、printf(n%4dn,j);j+;)文档仅供参考,不当之处,请联系改正。if(i%7=0)printf(nnn);)A f t *=right)return;while(i!=j)(while(i=temp)j-;ifOi)文档仅供参考,不当之处,请联系改正。ai=aj;ai已经赋值给temp,因此直接将aj赋值给ai,赋值完之后aj,有空位while(ij&ai=temp)i+;if(ij)aj=ai;)ai=temp;把基准插入,此 时i与j已经相等Rlow.pivotpos-l.keys W Rpivotpos.key WRpivotpos+l.high.keysquickSort(
36、a;/*递归左边*/quickSort(a,i+1,right);/*递归右边*/插入排序选择排序void SelectionSort(int*af int n)int i,j,index,value;for(i=0;i n-1;i+)文档仅供参考,不当之处,请联系改正。index=i;value=ai;for(j=i+1;j aj)index=j;value=aj;aindex=ai;ai=value;Display(az n);冒泡排序void BubbleSort(int array,int n)(int i,j,temp;外循环控制循环趟数for(i=0;in-l;i+)|内循环选择要
37、进行比较的数for(j=0;jarrayj+l)(temp=arrayj;arrayj=arrayj+l;arrayj+l=temp;printf(nnThe sorted numbers are:);for(i=0;in;i+)(printf(n,arrayi);)prmtf(nnnn);)堆排序void HeapAdjust(int*a,int i,int size)调整堆int lchild=2*i;/i的左孩子节点序号文档仅供参考,不当之处,请联系改正。int rchild=2*i+l;int max=i;if(i=size/2)行调整/i的右孩子节点序号临时变量如果i是叶节点就不用进
38、if(lchildamax)(max=lchild;)if(rchildamax)|max=rchild;)if(max!=i)swap(ai,amax);HeapAdjust(a,max,size);避免调整之后以max为父节点的子树不是堆)文档仅供参考,不当之处,请联系改正。void BuildHeap(int*a,int size)建立堆(int i;for(i=size/2;i=l;i-)非叶节点最大序号值为size/2|Heap Adjust(a9i?size);)void HeapSort(int*a,int size)堆排序(int i;BuildHeap(a,size);for
39、(i=size;i=l;i)(/coutaln n;swap(al,ai);交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面/BuildHeap(a,i-l);将余下元素重文档仅供参考,不当之处,请联系改正。新建立为大顶堆HeapAdjust(a,14-l);重新调整堆顶节点成为大顶堆)归并排序void Merge(int*SR,int*TR,int i,int m,int n)/将有序的和SRm+1.n归并为有序的TRi.nint j=m+1;int k=i;for(;i=m&j=n;+k)/将 SR 中记录按关键字从小到大地复制到T R中if(SRi=SRj)TRk=SRi+;
40、elseTRk=SRj+;)while(i=m)TRk+=SRi+;/将剩余的SRi.m复制到 TR文档仅供参考,不当之处,请联系改正。while(j=n)TRk+=SRj+;/将剩余的SRj.n复制到 TR/Mergevoid Msort(int*SR,int*TR1,int s,int t)/对SRs.t进行归并排序,排序后的记录存入TR1s.tif(s=t)TR1s=SRs;else int TR210;int m=(s+t)/2;/将 SRs.t平分为 SRs.m和 SRm+1.tMsort(SR,TR2Js,m);/递归地将 SRs.m归并为有序的TR2s.mMsort(SR,TR2
41、,m+1J t);/递归地将 SRm+1.t归并为有序的TR2m+1.tMerge(TR2,TR1,s,m,t);将 TR2s.m和TR2m+1.t归并到 TR1s t/else文档仅供参考,不当之处,请联系改正。/Msort基数排序int getdigit(int x,int d)|int a=1,1,10);因为待排数据最大数据也只是两位数,因此在此只需要到十位就满足return(x/ad)%10);确定桶号)void PrintArr(int ar,int n)(for(int i=0;i n;+i)coutarin n;coutendl;)void msdradix_sort(int
42、arr,int begin,int end,int d)const int radix=10;文档仅供参考,不当之处,请联系改正。int count radix,i,j;置空for(i=0;i radix;+i)|counti=0;)分配桶存储空间int bucket=(int*)malloc(end-begin+l)*sizeof(int);统计各桶需要装的元素的个数for(i=begin;i=end;+i)(countgetdigit(arri,d)+;)求出桶的边界索引,值为第i 个桶的右边界索引+1for(i=1;i=begin;-i)|j=getdigit(arri,d);求出关键码
43、的第d位的数字,例如:576的第3位是5bucketcountj-l=arri;放入对应的桶中,是第j个桶的右边界索引-countj;第j个桶放下一个元素的位置(右边界索引+1)注意:此时为第i个桶左边界从各个桶中收集数据for(i=begin,j=0;i=end;+i,+j)(arri=bucketj;)释放存储空间free(bucket);对各桶中数据进行再排序for(i=0;i radix;i+)int pl=begin+counti;第i个桶文档仅供参考,不当之处,请联系改正。的左边界int p2=begin+counti+l-l;第 i 个桶的右边界if(pl 1)(msdradix
44、_sort(arr,pl,p2,d-1);对第 i个桶递归调用,进行基数排序,数位降1)D.界面型a.OpenGL图形库程序黑白框void init(void)glClearColor(0.0,0.0,0.0,0.0);glShadeModel(GL_FLAT);)文档仅供参考,不当之处,请联系改正。void display(void)(glClear(GL_COLOR_BUFFER_BIT);glPushMatrix();glRotatef(spin,0.0,0.0,1.0);glColor3f(1.0,1.0,1.0);glRectf(-25.0,-25.0,25.0,25.0);glPo
45、pMatrix();glutswapBuffers();)void spinDisplay(void)(spin=spin+2.0;if(spin 360.0)spin=spin-360.0;glutPostRedisplay();)void reshape(int w,int h)(glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);文档仅供参考,不当之处,请联系改正。glLoadIdentity();/void glOrtho(GLdouble left,GLdoubleright,GLdouble botto
46、m,GLdouble top,GLdoublenear,GLdouble far);glOrtho(-50.0,50.0,-50.0,50.0,-1.0,1.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();)void mouse(int button,int state,int x,int y)(switch(button)(case GLUT_LEFT_BUTTON:if(state=GLUT_DOWN)glutIdleFunc(spinDisplay);break;case GLUT_MIDDLE_BUTTON:if(state=GLUT_DO
47、WN)glutIdleFunc(0);break;文档仅供参考,不当之处,请联系改正。default:break;)void keyboard(unsigned char key,int x,int y)(switch(key)(case a:g!utIdleFunc(spinDisplay);break;case s:glutIdleFunc(0);break;)螺旋曲线void SetupRC()glClear Color(O.Of,O.Of,O.Of,l.Of);glCo!or3f(1.0f,1.0f,1.0f);文档仅供参考,不当之处,请联系改正。)void RenderScene(v
48、oid)|GLfloat x,y,z,angle;glClear(GL_COLOR_BUFFER_BIT);glPushMatrixQ;glTranslatef(O,0,-80);/改动1:改变初始的位置glRotatef(XRot,1.0f,0.0f,0.0f);glRotatef(YRot,0.0f,1.0f,0.0f);glBegin(GL_POINTS);z=-50.0f;for(angle=0.0f;angle=(2.0f*GL_PI)*3.0f;angle+=0.1f)(x=50.0f*sin(angle);y=50.0f*cos(angle);glVertex3f(x,y,z);
49、z+=0.5f;文档仅供参考,不当之处,请联系改正。)glEndQ;glPopMatrix();glFIushQ;)/改动2:重定义视口及观察点void resize(int width,int height)(glViewport(0,0,width,height);gluPerspective(120,1.0,15,-15);)void special(int key,int x,int y)(switch(key)(case GLUT_KEY_LEFT:YRot-=5;glutPostRedisplay();文档仅供参考,不当之处,请联系改正。break;case GLUT_KEY_RI
50、GHT:YRot+=5;glutPostRedisplayO;break;case GLUT_KEY_UP:XRot+=5;glutPostRedisplayO;break;case GLUT_KEY_DOWN:XRot-=5;glutPostRedisplayO;break;)彩色立方体void ChangeSize(int w,int h)(GLfloat fAspect;/防止被0所除文档仅供参考,不当之处,请联系改正。if(h=0)h=1;/把视口设置为窗口大小glViewport。0,w,h);fAspect=(GLfloat)w/(GLfloat)h;实际窗口的纵横比/重置透视坐标