




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上 【一】需求分析 课程题目是排序算法的实现,课程设计一共要设计八种排序算法。这八种算法共包括:堆排序,归并排序,希尔排序,冒泡排序, 快速排序,基数排序,折半插入排序,直接插入排序。为了运行时的方便,将八种排序方法进行编号,其中1为堆排序,2为归并排序,3为希尔排序,4为冒泡排序,5为快速排序,6为基数排序,7为折半插入排序8为直接插入排序。 【二】概要设计1.堆排序算法思想:堆排序只需要一个记录大小的辅助空间,每个待排序的记录仅占有一个存储空间。将序列所存储的元素AN看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶结点的元素均不大于
2、(或不小于)其左右孩子(若存在)结点的元素。算法的平均时间复杂度为O(N log N)。程序实现及核心代码的注释: for(j=2*i+1; j<=m; j=j*2+1) if(j<m-1&&(suj<suj+1) j+; if(temp>=suj) break; sui=suj; i=j; sui=temp;void dpx() /堆排序 int i,temp; cout<<"排序之前的数组为:"<<endl; output(); for(i=N/2-1; i>=0; i-) head(i,N); fo
3、r(i=N-1; i>0; i-) temp=sui; sui=su0; su0=temp; head(0,i-1); cout<<"排序之后的数组为:"<<endl; output();2.归并排序1 算法思想:先将相邻的个数为1的每两组数据进行排序合并;然后对上次归并所得到的大小为2的组进行相邻归并;如此反复,直到最后并成一组,即排好序的一组数据。程序实现及核心代码的注释:int is21000;void bin(int low,int mid,int high) int i=low,j=mid+1,k=low; while(i<=m
4、id&&j<=high) if(sui<=suj) / 此处为排序顺序的关键,用小于表示从小到大排序 is2k+=sui+; else is2k+=suj+; while(i<=mid) is2k+=sui+; while(j<=high) is2k+=suj+; for(i=low; i<=high; i+) / 写回原数组 sui=is2i;void g(int a,int b) if(a<b) int mid=(a+b)/2; g(a,mid); g(mid+1,b); bin(a,mid,b); 3.希尔排序算法思想:先将整个待排记录
5、序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。其中,子序列的构成不是简单的“逐段分割”,而是将分隔某个“增量”的记录组成一个子序列。程序实现及核心代码的注释: while(m) m/=2; if(m!=0) for(i=m; i<N; i+) if(sui< sui-m) temp=sui; for(j=i-m; j>=0&&(temp<suj); j-=m) suj+m=suj; suj+m=temp; 4.冒泡排序算法思想:1、先将一组未排序的数组的最后一个数与倒数第二个数进行比较,并
6、将较小的数放于两个数中较前的位置,然后将比较后的较小的数与倒数第三个进行比较,依次比较到第一个数,即可得到第一个数是所有数中最小的数;2、然后再将数组的最后一个数与倒数第二个数进行比较,并将较小的数放于两个数中较前的位置,依次比较到第二个数,3、如此循环到只剩最后两个比较,即得到排好序的一组数。程序实现及核心代码的注释: for(i=0; i<N; i+) flag=true; for(j=0; j<N-1-i; j+) if(suj>suj+1) temp=suj; suj=suj+1; suj+1=temp; flag=false; if(flag=true) break
7、; cout<<"排序之后的数组为:"<<endl; output();int K;int find(int i,int j) int temp; bool flag=true; temp=sui; while(i<j) if(flag) while(temp<=suj) j-; if(i>=j) break; if(i>=j) break; sui=suj; while(temp>=sui) i+; if(i>=j) break; if(i>=j) break; suj=sui; flag=false; e
8、lse while(temp>=sui) i+; if(i>=j) break; suj=sui; if(i>=j) break; while(temp<=suj) j-; if(i>=j) break; sui=suj; flag=true; for(i=1; i<N; i+) head=sui; for(j=0; j<i; j+) if(head<suj) for(k=i; k>j; k-) suk=suk-1; suj=head; break; for(i=1; i<N; i+) head=sui; for(j=0; j<
9、i; j+) if(head<suj) for(k=i; k>j; k-) suk=suk-1; suj=head; break; 5.快速排序(1)任取待排序记录序列中的某个记录作为基准,按照该记录的关键字大小,将整个记录 序列划分为左右两个子序列。 左侧子序列中所有记录的关键字都小于或等于基准记录的关键字。 右侧子序列中所有记录的关键字都大于基准记录的关键字。 取序列第一个记录为枢轴记录,其关键字为Pivotkey;指针low指向序列第一个记录位置(low=1),指
10、针high指向序列最后一个记录位置(High=SeqList.Len) (2) 从high指向的记录开始,向前找到第一个关键字的值小于Pivotkey的记录,将其放到low指向的位置,low+ (3) 从low指向的记录开始,向后找到第一个关键字的值大于Pivotkey的记录,将其放到high指向的位置,high 重复2、3,直到low=high,将枢轴记录放在low(high)指向的位置。(2)程序实现及核心代码的注释:int find(int i,int j) int temp; bool flag=true; temp=sui
11、; while(i<j) if(flag) while(temp<=suj) j-; if(i>=j) break; if(i>=j) break; sui=suj; while(temp>=sui) i+; if(i>=j) break; if(i>=j) break; suj=sui; flag=false; else while(temp>=sui) i+; if(i>=j) break; suj=sui; if(i>=j) break; while(temp<=suj) j-; if(i>=j) break; su
12、i=suj; flag=true; sui=temp; cout<<"排完 "<<K+<<" 次顺序后的结果"<<endl; output(); return i;void qsort(int low,int high) if(low<high) int mid=find(low,high); qsort(low,mid-1); qsort(mid+1,high); 6.基数排序(1)算法的基本思想 : 基数排序是属于“分配式排序”,又称“桶子法”,它是透过键值的部份资讯,将要排序
13、的元素分配至某些“桶”中,藉以达到排序的作用。 最高位优先法,简称MSD法:先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。再将各组连接起来,便得到一个有序序列。(2)程序实现及核心代码的注释:for(i=0; i<N; i+) if(max<sui) max=sui; aH(sui)bH(sui)+=sui; k=0; for(i=0; i<10; i+) if(bi!=0) for(j=0; j<bi; j+) suk+=aij; cout<&l
14、t;"第一躺排序之后的数组为:"<<endl; output(); /第二次 if(max/10=0) return ; for(i=0; i<10; i+) bi=0; for(i=0; i<N; i+) aHH(sui)bHH(sui)+=sui; k=0; for(i=0; i<10; i+) if(bi!=0) for(j=0; j<bi; j+) suk+=aij; cout<<"第二躺排序之后的数组为:"<<endl; output(); /第三次 if(max/100=0) ret
15、urn ; for(i=0; i<10; i+) bi=0; for(i=0; i<N; i+) aHHH(sui)bHHH(sui)+=sui; k=0; for(i=0; i<10; i+) if(bi!=0) for(j=0; j<bi; j+) suk+=aij; 7.折半排序算法思想:由于折半插入排序的基本操作是在一个有序表中进行查找和插入,这个“查找”操作可利用折半查找来实现,由此进行的插入排序称之为折半插入排序。折半插入排序所需附加存储空间和直接插入排序相同,从时间上比较,这般插入排序仅减少了关键字间的比较次数,而记录的移动次数 不变。因此,这般插入排序的
16、时间复杂度仍为O(n2)。程序实现及核心代码的注释:for(i=1; i<N; i+) temp=sui; low=0; high=i-1; while(low<=high) m=(low+high)/2; if(temp<sum) high=m-1; else low=m+1; for(j=i; j>high+1; j-) suj=suj-1; suhigh+1=temp; 8.直接插入排序算法思想:直接插入排序是一种最简单的排序方法,它的基本操作是将一个记录插入到一个已排好序的有序表中,从而得到一个新的、记录数增一的有序表。在自i-1起往前搜索的过程中,可以同时后移
17、记录。整个排序过程为进行n-1趟插入,即:先将序列中的第一个记录看成是一个有序的子序列,然后从第二个记录起逐个进行插入,直至整个序列变成按关键字非递减有序序列为止。程序实现及核心代码的注释:for(i=1; i<N; i+) head=sui; for(j=0; j<i; j+) if(head<suj) for(k=i; k>j; k-) suk=suk-1; suj=head; break; 【三】详细设计程序代码:#include <iostream>#include <cstdio>#include <cstdlib>#inc
18、lude <algorithm>#include <cmath>#define H(X) (X%10)#define HH(X) (X%100/10)#define HHH(X) (X/100)using namespace std;/int ss10000= 32,37,64,87,16,12,24,32; /将要排序的数组int ss10000= 372,209,53,942,547,234,645,468,7,83; /将要排序的数组int su10000; /将要排序的数组int N=10; /数组的长度void input() /数组的输入函数 cout<
19、;<"请输入要排序的数组的长度N:" cin>>N; cout<<"请输入需要排序的数组:"<<endl; for(int i=0; i<N; i+) cin>>ssi;void output() /数组的输出函数 for(int i=0; i<N; i+) cout<<sui<<" " cout<<endl;void head(int i,int m) /堆排序的一个函数 int j; int temp; temp=sui; for
20、(j=2*i+1; j<=m; j=j*2+1) if(j<m-1&&(suj<suj+1) j+; if(temp>=suj) break; sui=suj; i=j; sui=temp;void dpx() /堆排序 int i,temp; cout<<"排序之前的数组为:"<<endl; output(); for(i=N/2-1; i>=0; i-) head(i,N); for(i=N-1; i>0; i-) temp=sui; sui=su0; su0=temp; head(0,i-1)
21、; cout<<"排序之后的数组为:"<<endl; output();int is21000;void bing(int low,int mid,int high) int i=low,j=mid+1,k=low; while(i<=mid&&j<=high) if(sui<=suj) / 此处为排序顺序的关键,用小于表示从小到大排序 is2k+=sui+; else is2k+=suj+; while(i<=mid) is2k+=sui+; while(j<=high) is2k+=suj+; for
22、(i=low; i<=high; i+) / 写回原数组 sui=is2i;void g(int a,int b) if(a<b) int mid=(a+b)/2; g(a,mid); g(mid+1,b); bing(a,mid,b); void gbpx() /归 并 排 序 cout<<"排序之前的数组为:"<<endl; output(); g(0,N-1); cout<<"排序之后的数组为:"<<endl; output();void xepx() /希 尔 排 序 int i,j,t
23、emp; int m=N; cout<<"排序之前的数组为:"<<endl; output(); while(m) m/=2; if(m!=0) for(i=m; i<N; i+) if(sui< sui-m) temp=sui; for(j=i-m; j>=0&&(temp<suj); j-=m) suj+m=suj; suj+m=temp; cout<<"排序之后的数组为:"<<endl; output();void mppx() /冒 泡 排 序 int i,j
24、,k; int temp,min; bool flag; cout<<"排序之前的数组为:"<<endl; output(); for(i=0; i<N; i+) flag=true; for(j=0; j<N-1-i; j+) if(suj>suj+1) temp=suj; suj=suj+1; suj+1=temp; flag=false; if(flag=true) break; cout<<"排序之后的数组为:"<<endl; output();int K;int find(int
25、 i,int j) int temp; bool flag=true; temp=sui; while(i<j) if(flag) while(temp<=suj) j-; if(i>=j) break; if(i>=j) break; sui=suj; while(temp>=sui) i+; if(i>=j) break; if(i>=j) break; suj=sui; flag=false; else while(temp>=sui) i+; if(i>=j) break; suj=sui; if(i>=j) break; w
26、hile(temp<=suj) j-; if(i>=j) break; sui=suj; flag=true; sui=temp; cout<<"排完 "<<K+<<" 次顺序后的结果"<<endl; output(); return i;void qsort(int low,int high) if(low<high) int mid=find(low,high); qsort(low,mid-1); qsort(mid+1,high); void kspx() /快 速 排 序 K=0
27、; cout<<"排序之前的数组为:"<<endl; output(); qsort(0,N-1); cout<<"排序之后的数组为:"<<endl; output();void jspx() /基 数 排 序 int i,j,k; int max=0; int a10100; int b10= 0; cout<<"排序之前的数组为:"<<endl; output(); for(i=0; i<N; i+) if(max<sui) max=sui; aH
28、(sui)bH(sui)+=sui; k=0; for(i=0; i<10; i+) if(bi!=0) for(j=0; j<bi; j+) suk+=aij; cout<<"第一躺排序之后的数组为:"<<endl; output(); /第二次 if(max/10=0) return ; for(i=0; i<10; i+) bi=0; for(i=0; i<N; i+) aHH(sui)bHH(sui)+=sui; k=0; for(i=0; i<10; i+) if(bi!=0) for(j=0; j<bi
29、; j+) suk+=aij; cout<<"第二躺排序之后的数组为:"<<endl; output(); /第三次 if(max/100=0) return ; for(i=0; i<10; i+) bi=0; for(i=0; i<N; i+) aHHH(sui)bHHH(sui)+=sui; k=0; for(i=0; i<10; i+) if(bi!=0) for(j=0; j<bi; j+) suk+=aij; cout<<"第三次排序之后的数组为:"<<endl; out
30、put();void zbcrpx() /折半插入排序 int i,j,k,m; int low,high,temp; cout<<"排序之前的数组为:"<<endl; output(); for(i=1; i<N; i+) temp=sui; low=0; high=i-1; while(low<=high) m=(low+high)/2; if(temp<sum) high=m-1; else low=m+1; for(j=i; j>high+1; j-) suj=suj-1; suhigh+1=temp; cout<
31、;<"排序之后的数组为:"<<endl; output();void zjcrpx() /直接插入排序 int i,j,k; int temp,head; cout<<"排序之前的数组为:"<<endl; output(); for(i=1; i<N; i+) head=sui; for(j=0; j<i; j+) if(head<suj) for(k=i; k>j; k-) suk=suk-1; suj=head; break; cout<<"排序之后的数组为:"<<endl; output();void jiemian() cout<<"*"<<endl; cout<<"*"<<endl; cout<<"*< 1: 堆排序 >*"<<endl; cout<<"*< 2: 归并排序 >*"<<endl; cout<<"*< 3: 希尔排序 >*"<<
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度综合性劳动合同范本
- 肇庆市实验中学高中历史二:第三单元各个经济体制的创新和调整测验教案
- 2025黑龙江省旅游投资集团有限公司事业部及共享中心招聘15人笔试参考题库附带答案详解
- 2025企业寒假实习生合同协议书
- 2025年中国膜式高压氧气压缩机市场调查研究报告
- 2025【园林景观工程合同范本】质量保修金条款
- 变态反应科专业知识考核试卷
- 电子真空器件的微波光子学研究考核试卷
- 灯具制造过程中的节能减排措施考核试卷
- 国企首都机场集团有限公司内蒙古地区招聘笔试参考题库附带答案详解
- 温度传感器Pt100-阻值-温度对照表(方便实用)
- 《地球物理勘探》课件
- 河南省濮阳市清丰县2023-2024学年八年级上学期期中生物试题( 含答案解析 )
- 30道智能驾驶工程师岗位常见面试问题含HR问题考察点及参考回答
- 护林员劳务派遣投标方案(技术标)
- JGJT208-2010 后锚固法检测混凝土抗压强度技术规程
- 北师大版小学英语3-6年级单词-(三起)带音标-精华版
- 公共卫生概论课件
- 菌种计数记录
- 衡水介绍-衡水简介PPT(经典版)
- 电力建设施工现场安全文明施工标准化管理
评论
0/150
提交评论