1、完整版数据结构课程设计报告数据结构课程设计报告一 前沿:排序是数据结构中的一块难点,也是重点。熟练的掌握各种各样的排序算法是对每个编程人员的基本的要求。历年的考研还是期末考中,排序都占了比较大的比重。二 程序实现的功能:本程序采用了各种不同的方法对同一个输入进行排序,且每一个元素其本身亦是一个结构体,又可以进行扩充,使其可以存储其他的相关的信息。在此我仅仅举了结构体本身只有一个元素的情况。a) 采用的数据类型:为了讨论的方便,本程序采用了复合型的结构体类型,且才用了静态线性表的形式,不能进行扩充,一旦空间开辟,就不能在扩充(注意)。具体如下:typedef struct /每个元素的类型定义,
2、为了讨论的方便本程序采用了单关键字;int key; /但可以根据需要扩充,每个关键字令其为整型的;redtype;typedef struct /开辟的数组,以上述类型的元素组成;redtype *r; /存入要输入的元素的数组;int length; /数组的长度,shellsort中要用到; sqlist;四 对部分头文件和函数的说明:改头文件主要用来实现清屏,使得出的结果更清晰明白。“shellsort(sqlist l,int d)”:该函数主要实现希尔排序,使无序的数据排列成有序的序列“quicksort(sqlist l,int low,int high)”:该函数实现的功能同上
3、,只是原理不同“heapadjust(sqlist l,int s,int m)”:该函数实现调整无序的数据序列使其成为大顶堆,即树型结构的最上面是值最大的,这样进过一次的调整便得到了值最大的元素,即可进过多次的排序使一个无序的序列又序。“heapsort(sqlist l)”:该函数实现建立堆的过程。在其中间调用heapadjust实现最终建立大顶的任务。“oesort(sqlist l,int n)”:该函数进行奇偶排序将无序的数据排成有序的。五 核心程序算法:void shellsort(sqlist& l,int d) /采用希尔排序,本程序中的l.r0.key使暂存单元,非哨兵。d=
4、l.length/2;while(d0)for(i=d+1;i=l.length;+i)if(l.ri.key0&l.r0.keyl.rj.key;j-=d)l.rj+d=l.rj;l.rj+d=l.r0;d=d/2;基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2d1重复上述的分组和排序,直至所取的增量dt=1(dtdt-ld2d1),即所有记录放在同一组中进行直接插入排序为止。该方法实质上是一种分组插入方法void quicksort(sqlist& l,int lo
5、w,int high)/快速排序if(lowhigh) );/对rlow.high进行一次快速排序i=low;j=high;l.r0=l.ri;dowhile(il.r0.key)-j;if(ij)l.ri=l.rj;+i;while(ij&l.ri.key=l.r0.key)+i;if(ij)l.rj=l.ri;-j;while(i!=j);l.ri=l.r0;quicksort(l,low,i-1); 对rlow.i-1进行快速排序quicksort(l,i+1,high); 对rI+1.high进行快速排序基本思想设当前待排序的无序区为rlow.high,利用分治法可将快速排序的基本思想
6、描述为:分解:在rlow.high中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间rlow.pivotpos-1和rpivotpos+1.high,并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。注意:划分的关键是要求出基准记录所在的位置pivotpos。划分的结果可以简单地表示为(注pivot=rpivotpos)rlow.pivotpos-1.keysrpivo
7、tpos.keyrpivotpos+1.high.keys其中lowpivotposhigh。求解:通过递归调用快速排序对左、右子区间Rlow.pivotpos-1和rpivotpos+1.high快速排序。组合:因为当求解步骤中的两个递归调用结束时,其左、右两个子区间已有序。对快速排序而言,组合步骤无须做什么,可看作是空操作。void heapadjust(sqlist &l,int s,int m)/ /筛选法调整堆,使其成为大顶堆rc=l.rs.key;for(j=2*s;j=m;j*=2)if(jm&l.rj.keyl.rj.key)break;l.rs.key=l.rj.key;s=
8、j;l.rs.key=rc;void heapsort(sqlist &l)/建堆的过程for(i=l.length/2;i0;i-)heapadjust(l,i,l.length);for(i=l.length;i1;i-)t=l.r1.key,l.r1.key=l.ri.key,l.ri.key=t;heapadjust(l,1,i-1);基本思想:堆排序利用了大根堆堆顶记录的关键字最大这一特征,使得在当前无序区中选取最大关键字的记录变得简单。先将初始文件R1.n建成一个大根堆,此堆为初始的无序区。再将关键字最大的记录R1(即堆顶)和无序区的最后一个记录rn交换,由此得到新的无序区r1.n
9、-1和有序区rn,且满足r1.n-1.keysrn.key。由于交换后新的根R1可能违反堆性质,故应将当前无序区r1.n-1调整为堆。然后再次将r1.n-1中关键字最大的记录r1和该区间的最后一个记录Rn-1交换,由此得到新的无序区r1.n-2和有序区rn-1.n,且仍满足关系r1.n-2.keysrn-1.n.keys,同样要将r1.n-2调整为堆。直到无序区只有一个元素为止。void oesort(sqlist& l,int n)/奇偶交换排序change=1;标志变量,若其为零,即两次更替的交换中都没有交换数据,即排序结束while(change)change=0;for(i=1;il.
10、ri+1.key)t=l.ri.key,l.ri.key=l.ri+1.key,l.ri+1.key=t;change=1;for(i=2;il.ri+1.key)t=l.ri.key,l.ri.key=l.ri+1.key,l.ri+1.key=t;change=1;算法过程:第一趟对序列中的所有奇数项i扫描,第二趟对序列中的所有偶数项i扫描。若ri ri+1,则交换它们。第三趟有对所有的奇数项,第四趟对所有的偶数项,如此反复,直到整个序列全部排好序为止。五源程序:#include stdio.h#include malloc.h#include conio.h#define maxsize
11、 5typedef structint key;redtype;typedef structredtype *r;int length;sqlist;void shellsort(sqlist l,int d)int i,j;d=l.length/2;while(d0)for(i=d+1;i=l.length;+i)if(l.ri.key0&l.r0.keyl.rj.key;j-=d)l.rj+d=l.rj;l.rj+d=l.r0;d=d/2;void quicksort(sqlist l,int low,int high)int i,j;if(lowhigh)i=low;j=high;l.r
12、0=l.ri;dowhile(il.r0.key)-j;if(ij)l.ri=l.rj;+i;while(ij&l.ri.key=l.r0.key)+i;if(ij)l.rj=l.ri;-j;while(i!=j);l.ri=l.r0;quicksort(l,low,i-1);quicksort(l,i+1,high);void heapadjust(sqlist l,int s,int m)int rc,j;rc=l.rs.key;for(j=2*s;j=m;j*=2)if(jm&l.rj.keyl.rj.key)break;l.rs.key=l.rj.key;s=j;l.rs.key=rc
13、;void heapsort(sqlist l)int i,t;for(i=l.length/2;i0;i-)heapadjust(l,i,l.length);for(i=l.length;i1;i-)t=l.r1.key,l.r1.key=l.ri.key,l.ri.key=t;heapadjust(l,1,i-1);void oesort(sqlist l,int n)int t,i,change;change=1;while(change)change=0;for(i=1;il.ri+1.key)t=l.ri.key,l.ri.key=l.ri+1.key,l.ri+1.key=t;change=1;for(i=2;il.ri+1.key)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1