各种排序实验报告(共25页).doc
《各种排序实验报告(共25页).doc》由会员分享,可在线阅读,更多相关《各种排序实验报告(共25页).doc(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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(jm-1&(suj=suj) break; sui=suj; i=j; sui=temp;void dpx() /堆排序 int i,temp; cout排序之前的数组为:=0; i-) head(i,N); for(i=N-1; i0; i-) temp=sui; sui=su0; su0=temp; head(0,i-1); cout排序之后的数组为:endl; output();2.归并排序 算法思想:先将相邻的个
3、数为1的每两组数据进行排序合并;然后对上次归并所得到的大小为2的组进行相邻归并;如此反复,直到最后并成一组,即排好序的一组数据。程序实现及核心代码的注释:int is21000;void bin(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(i=low; i=h
4、igh; i+) / 写回原数组 sui=is2i;void g(int a,int b) if(ab) int mid=(a+b)/2; g(a,mid); g(mid+1,b); bin(a,mid,b); 3.希尔排序算法思想:先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。其中,子序列的构成不是简单的“逐段分割”,而是将分隔某个“增量”的记录组成一个子序列。程序实现及核心代码的注释: while(m) m/=2; if(m!=0) for(i=m; iN; i+) if(sui=0&(tempsuj); j
5、-=m) suj+m=suj; suj+m=temp; 4.冒泡排序算法思想:1、先将一组未排序的数组的最后一个数与倒数第二个数进行比较,并将较小的数放于两个数中较前的位置,然后将比较后的较小的数与倒数第三个进行比较,依次比较到第一个数,即可得到第一个数是所有数中最小的数;2、然后再将数组的最后一个数与倒数第二个数进行比较,并将较小的数放于两个数中较前的位置,依次比较到第二个数,3、如此循环到只剩最后两个比较,即得到排好序的一组数。程序实现及核心代码的注释: for(i=0; iN; i+) flag=true; for(j=0; jsuj+1) temp=suj; suj=suj+1; su
6、j+1=temp; flag=false; if(flag=true) break; cout排序之后的数组为:endl; output();int K;int find(int i,int j) int temp; bool flag=true; temp=sui; while(ij) if(flag) while(temp=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=
7、j) break; suj=sui; if(i=j) break; while(temp=j) break; sui=suj; flag=true; for(i=1; iN; i+) head=sui; for(j=0; ji; j+) if(headj; k-) suk=suk-1; suj=head; break; for(i=1; iN; i+) head=sui; for(j=0; ji; j+) if(headj; k-) suk=suk-1; suj=head; break; 5.快速排序(1)任取待排序记录序列中的某个记录作为基准,按照该记录的关键字大小,将整个记录 序列划分为左
8、右两个子序列。左侧子序列中所有记录的关键字都小于或等于基准记录的关键字。右侧子序列中所有记录的关键字都大于基准记录的关键字。取序列第一个记录为枢轴记录,其关键字为Pivotkey;指针low指向序列第一个记录位置(low=1),指针high指向序列最后一个记录位置(High=SeqList.Len)(2)从high指向的记录开始,向前找到第一个关键字的值小于Pivotkey的记录,将其放到low指向的位置,low+(3)从low指向的记录开始,向后找到第一个关键字的值大于Pivotkey的记录,将其放到high指向的位置,high重复2、3,直到low=high,将枢轴记录放在low(high
9、)指向的位置。(2)程序实现及核心代码的注释:int find(int i,int j) int temp; bool flag=true; temp=sui; while(ij) if(flag) while(temp=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=j) break;
10、 sui=suj; flag=true; sui=temp; cout排完 K+ 次顺序后的结果endl; output(); return i;void qsort(int low,int high) if(lowhigh) int mid=find(low,high); qsort(low,mid-1); qsort(mid+1,high); 6.基数排序(1)算法的基本思想:基数排序是属于“分配式排序”,又称“桶子法”,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用。最高位优先法,简称MSD法:先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排
11、序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。再将各组连接起来,便得到一个有序序列。(2)程序实现及核心代码的注释:for(i=0; iN; i+) if(maxsui) max=sui; aH(sui)bH(sui)+=sui; k=0; for(i=0; i10; i+) if(bi!=0) for(j=0; jbi; j+) suk+=aij; cout第一躺排序之后的数组为:endl; output(); /第二次 if(max/10=0) return ; for(i=0; i10; i+) bi=0; for(i=0; iN; i+) a
12、HH(sui)bHH(sui)+=sui; k=0; for(i=0; i10; i+) if(bi!=0) for(j=0; jbi; j+) suk+=aij; cout第二躺排序之后的数组为:endl; output(); /第三次 if(max/100=0) return ; for(i=0; i10; i+) bi=0; for(i=0; iN; i+) aHHH(sui)bHHH(sui)+=sui; k=0; for(i=0; i10; i+) if(bi!=0) for(j=0; jbi; j+) suk+=aij; 7.折半排序算法思想:由于折半插入排序的基本操作是在一个有序
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 各种 排序 实验 报告 25
限制150内