

已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验报告实验名称 冒泡排序和快速排序 班 级 学 号 姓 名 成 绩 实验概述: 【实验目的及要求】 1. 实验目的通过编程程序达到熟悉并掌握教材中所介绍的几种排序方法。2. 实验内容1)随机产生20位整数2)输入序列,编写程序,按下列排序方法将序列从小到大排序并输出。1.冒泡排序2.快速排序3)纪录每种方法比较次数和移动次数3. 实验步骤和要求同上【实验原理】1. 冒泡排序冒泡排序(bubblesort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中得到一个新的最大数。如此下去,直至最终完成排序。2. 快速排序设要排序的数组是a0an-1,首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。一趟快速排序的算法是:1)设置两个变量i、j,排序开始的时候:i=0,j=n-1;2)以第一个数组元素作为关键数据,赋值给key,即key=a0;3)从j开始向前搜索,即由后开始向前搜索(j-),找到第一个小于key的值aj,将aj和ai互换;4)从i开始向后搜索,即由前开始向后搜索(i+),找到第一个大于key的ai,将ai和aj互换;5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中aj不小于key,4中ai不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i=j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。【实验环境】(使用的软硬件) 处理器 英特尔 core i5-4200m 2.50ghz 双核 内存 4 gb ( 记忆科技 ddr3l 1600mhz )操作系统 windows 10 专业版 64位 ( directx 12 )编译环境 dev-c+ 5.6.1编译语言 c 实验内容:【实验方案设计】1. 利用rand()函数生成20个随机数,并放到两个数组中分别用于冒泡排序和快速排序2.利用比较和交换,每次讲一个最大的元素放到数组末尾,实现冒泡排序3.在每次快速排序的算法中,先设置一个基准值,利用头指针和尾指针轮流比较数组中的元素,若遇到不属于low或high的元素则交换到另一个组中去,最后将基准值放入首尾指针相交的位置上。利用递归调用实现对整个数组的快速排序算法。4.整理实验结果,写出实验报告【实验过程】(实验步骤、记录、数据、分析)实验一:源代码:/*实验3:冒泡排序和快速排序1.随机产生20位整数2.输入序列,编写程序,按下列排序方法将序列从小到大排序并输出。 (1)冒泡排序 (2)快速排序3.纪录每种方法比较次数和移动次数*/#include#include#define n 20/定义用于比较和交换计数的全局变量static int compare, move;int main()int data1n, data2n;int i;void bubblesort(int20);void quicksort(int20, int, int); /创建两个相同的数组用于两种排序方法for (i = 0; in; i+)data1i = rand() % 100 + 1;data2i = data1i;printf(the original array:n);for (i = 0; in; i+)printf(%d , data1i);/调用冒泡排序法bubblesort(data1);/计数器置零compare = 0;move = 0;/调用快速排序法quicksort(data2, 0, n - 1);printf(quicksort completed!the results are as follows:n);for (i = 0; in; i+)printf(%d , data2i);printf(ncompare times:%dn, compare);printf(move times:%d, move);return 0;/冒泡排序法void bubblesort(int an)int i, j, temp;compare = 0;move = 0;/总共循环n-2轮for (i = 0; in - 1; i+)/每轮循环从头开始,到有序序列前结束for (j = 0; jn - i - 1; j+)/比较交换,将较大的数放到后面if (aj + 1aj)temp = aj + 1;aj + 1 = aj;aj = temp;move+;compare+;printf(nnbubblesort completed!the results are as follows:n);for (i = 0; in; i+)printf(%d , ai);printf(ncompare times:%dn, compare);printf(move times:%dnn, move);/快速排序法void quicksort(int an, int left, int right)/将数组一分为二的键值int pivotkey;if (left right)/第一次排序将数组一分为二pivotkey = partition(a, left, right);/递归调用,对数据比键值小的数组排序quicksort(a, left, pivotkey - 1);/递归调用,对数据比键值大的数组排序quicksort(a, pivotkey + 1, right);/进行一次快速排序int partition(int an, int left, int right)int key, i, low = left, high = right;/设置基准key = alow;while (lowhigh)/high中数据比基准大,则向前依次查找while (low key)high-;compare+;/如果不是两指针相遇,说明存在需要交换到low的值if (low high)alow = ahigh;move+;/low中数据比基准小,则向后依次查找while (low high) & (alow = key)low+;compare+;/如果不是两指针相遇,说明存在需要交换到high的值if (lowhigh)ahigh = alow;move+; /首尾指针相遇后,将基准放入空位alow = key;/返回此时的键值return low;运行结果:【结论】(结果)1.由实验结果知,编写的冒泡排序法和快速排序法都成功的将一个无序的数组排成了一个有序数组并打印输出,说明这两种算法是可行的。2.从记录的比较值和移动值的大小来看,冒泡排序比较了190次,即(n*n-1)/2次,交换了87次;快速排序法比较了64次,交换了27次。可以明显的看出快速排序法的效率较高,运行速度较快。可以猜想,当数据量进一步扩大时,快速排序法将比冒泡排序法的平均运行速度更短【小结】这次的实验题目是关于两种算法的。由于在之前的c语言学习中我已经对这两种算法有了一个大致的了解,所以编写源程序及调试并不困难,最后的运行结果也是正确的。但是,与之前的学习不同的是,在本次试验中加入了对比较和交换次数的比较。这就涉及到了数据结构中算法的时间复杂度问题。经过查阅资料得知,冒泡排序最好的时间复杂度为o(n)。若初始文件是反序的,需要进行n-1趟排序。每趟排序要进行n-i次关键字的比较(1in-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值: 。冒泡排序的最坏时间复杂度为o(n2)。综上,冒泡排序总的平均时间复杂度为o(n2)。快速排序法的最坏情况运行时间为(n2),且最坏情况发生在每次划分过程产生的两个区间分别包含n-1个元素和1个元素的时候。最好情况是o(nlogn),出现在每次划分过程产生的区间大小都为n/2时。综上,快速排序总的平均时间复杂度为o(n2)。在数据量小时两者区别不大,但在数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 年会组织设计
- 护理简单教学课件
- 丽江别墅花园管理办法
- 保洁部门工具管理办法
- 2025至2030全球及中国脚本编写软件行业项目调研及市场前景预测评估报告
- 乡镇环境信访管理办法
- 企业边界噪声管理办法
- 中铁集团台账管理办法
- 企业发债管理办法模板
- 云南基坑工程管理办法
- 刑事和解协议书自诉
- 三方委托收款协议范本8篇
- 奶茶服务协议合同
- 书籍保密协议书范文
- 2025年秋季学期特殊教育教学工作计划
- 基层护理进修后回院汇报
- 护理查对制度安全警示教育
- 2024年四川成都农业科技中心招聘笔试真题
- 2025年滨州生物会考试题及答案
- 公路改扩建工程地质灾害危险性评估报告
- 四川省2024年普通高等学校高职教育单独招生文化考试数学试题
评论
0/150
提交评论