c语言程序设计排序算法.docx
- 文档编号:24369401
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:14
- 大小:118.82KB
c语言程序设计排序算法.docx
《c语言程序设计排序算法.docx》由会员分享,可在线阅读,更多相关《c语言程序设计排序算法.docx(14页珍藏版)》请在冰豆网上搜索。
c语言程序设计排序算法
学号
2014-2015学年第2学期
《高级语言程序设计》
课程设计报告
题目:
排序算法
专业:
班级:
姓名:
指导教师:
成绩:
计算机与信息工程系
2015年3月26日
引言
伴随着社会的发展,数据也变得越来越庞大。
如何将庞大的数据进行很好的排序,使用户更加方便的查找资料,成了一件越来越重要的问题。
对于程序员来说,这将是一个挑战。
经常查找资料的朋友都会知道,面对海量的资料,如果其查找资料没有进行排序,那么其查找资料将会是一家非常痛苦的事情。
针对这一问题,我们自此通过一个课程设计来解决它。
理论上排序算法有很多种,不过本课程设计只涉及到三种算法。
这三种算法包括:
冒泡排序,选择排序,直接插入排序。
本课程设计通过对这三种算法的运行情况进行对比,选择最优秀的算法出来。
希望通过我的努力能解决一些问题,带来一些方便。
需求分析
本课程题目是排序算法的实现,由于各方面的原因,本科程设计一共需要设计三种排序算法。
这三种算法包括:
冒泡排序,选择排序,直接插入排序。
三种排序算法各有独到之处,因此我们要通过各种调试分析来比较其优劣长短。
由于使用的调试软件及操作系统不一样。
因此个别程序在不同的软件上可能会报错。
本课程软件运行的的操作系统为Windows764位操作系统。
所使用的软件为MicrosoftVisualC++6.0以及TurboC2.0
第一章程序内容及要求
1.1冒泡排序
冒泡排序(BubbleSort,台湾译为:
泡沫排序或气泡排序)是一种简单的排序算法。
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。
冒泡排序(BubbleSort)的基本概念是:
依次比较相邻的两个数,将小数放在前面,大数放在后面。
即在第一趟:
首先比较第1个和第2个数,将小数放前,大数放后。
然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。
至此第一趟结束,将最大的数放到了最后。
在第二趟:
仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。
如此下去,重复以上过程,直至最终完成排序。
用二重循环实现,外循环变量设为i,内循环变量设为j。
假如有10个数需要进行排序,则外循环重复9次,内循环依次重复9,8,...,1次。
每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,...,9,对于每一个i,j的值依次为1,2,...10-i。
冒泡排序算法的性能
1.2选择排序
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
选择排序是不稳定的排序方法。
基本思想:
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
①初始状态:
无序区为R[1..n],有序区为空。
②第1趟排序在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,
使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
……③
第i趟排序第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(1≤i≤n-1)。
该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R交换,
使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。
选择排序法的第一层循环从起始元素开始选到倒数第二个元素,主要是在每次进入的第二层循环之前,
将外层循环的下标赋值给临时变量,接下来的第二层循环中,如果发现有比这个最小位置处的元素更小的
元素,则将那个更小的元素的下标赋给临时变量,最后,在二层循环退出后,如果临时变量改变,则说明,
有比当前外层循环位置更小的元素,需要将这两个元素交换
1.3插入排序
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法--插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。
是稳定的排序方法。
插入算法把要排序的数组分成两部分:
第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。
在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
插入排序的基本思想是:
每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
⒈从有序数列和无序数列{a2,a3,…,an}开始进行排序;
⒉处理第i个元素时(i=2,3,…,n),数列{a1,a2,…,ai-1}是已有序的,而数列{ai,ai+1,…,an}是无序的。
用ai与ai-1,ai-2,…,a1进行比较,找出合适的位置将ai插入;
⒊重复第二步,共进行n-i次插入处理,数列全部有序。
第二章概要设计
2.1冒泡排序
在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。
即:
每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
for(i=0;i<10;i++)第一轮循环,输入十个数据。
scanf(“%d”,&a[i]);
printf(“\n”);
for(j=0;j<9;j++)挨个判断输入的书的大小,第二轮循环
for(i=0;i<9-j;i++)
if(a[i]>a[i+1]
{
t=a[i];进行数的调换,把大的数据调到后面。
a[i]=a[i+1];
a[i+1]=t;
2.2选择排序
简单选择排序,每趟循环只能确定一个元素排序后的定位。
我们可以考虑改进为每趟循环确定两个元素(当前趟最大和最小记录)的位置,从而减少排序所需的循环次数。
改进后对n个数据进行排序,最多只需进行[n/2]趟循环即可。
voidselect_sort(inta[],intn)//n为数组a的元素个数
{//进行N-1轮选择
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 排序 算法