资源描述:
《基于冒泡和直接插入排序的》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、基于冒泡和直接插入排序的二分查找算法实现及复杂度分析1.引言《算法语言与程序设计》课程设计是算法语言与程序设计的重要组成部分,是为强化算法语言与程序设计课程教学和实验教学的内容、为提高同学们应用算法语言综合编程的能力而进行的针对课程内容的综合性设计训练。此次的设计要求是根据指导老师所给出的一组数据进行排序及分析。第一步是建立一个合适的数据文件;第二步是读入数据;第三步是选择冒泡和直接插入排序算法;第四步是实现二分查找法查找指定关键字对应数据,并输出查找结果。2.算法原理2.1冒泡排序算法冒泡排序的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在
2、后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数屮得到一个新的最大数。如此下去,直至最终完成排序。2.2直接插入排序算法直接插入排序的基本概念是:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所
3、有无序区元素都移动到有序区完成排序。2.3二分查找算法二分查找算法的基木原理:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。3.算法步骤3.1冒泡排序算法步骤及流程图冒泡排序算法流程图2.2直接插入排序算法步骤及流程图NJ将为前元素向后移动▼将无序区川的第一个元素放到临时变量中:始J表示
4、有序区中的最后一个元素的位W(temocRUl)&&(J>=0)=temp找到插入位置后将第一个1亓素插入i束亠1有序区中比较下一个3.2二分查找算法及流程图二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,口插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者和等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上
5、过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。4.程序设计4.1数据文件准备应用MicrosoftExcel2010软件建立txt文件4.2程序总体结构C建议采用模块化程序设计〉本程序一共包含7个模块,如图所示:4.3文件读写打开文件代码:FILE*in;in=fopen(HOoo.txt,,z,,r,');if(in==NULL){printf("ooo.txtcannotopen!");exit(O);}关闭文件代码:fclose(in);2.4两次直接插入排序算法函数voidinsertion_sort(datap
6、[]){"inti,j,n,k;for(i=1;i<200;i++){datar;j=i-1;r=p[i];n=p[i].dileibm;while(j>=0&&p[j].dileibm>n){pO+1]=pU);p[j+l]=r;if(p[j].dileibm==p[j+l].dileibm){k二j;n二p[j+l].tubanbh;while(k>=0&&p[k].tubanbh>n){p[k+1]二p[k];k-;if(p[k].dileibm
7、bble_sort(datap[]){~inti,j,k,n,a[200],b[200];datat;for(i=1;i<200;i++){for(j=0;j<200-i;j++)if(p[j].dileibm>p[j+l].dileibm){t=p[j];pDJ=p[j+iJ;pU+i]=t;for(i=0J=l;i<200;i++)if(p[i].dileibm!=p[i+l].dileibm){a[j]=i+l,b[j-l]=i,j++;n=j;}a[0]=0,b[j]=200;for(i=0;ivn;i++){for(k=0;k
8、];k++){for(j=a[i];j