预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

实验三排序姓名:班级:学号:实验要求1.1实验目的通过选择下面题目,学习、实现、对比各种排序算法,掌握各种排序算法的优劣,以及各种算法使用的情况。1.2实验内容使用简单数组实现下面各种排序算法,并进行比较。排序算法:1、插入排序2、希尔排序3、冒泡排序4、快速排序5、简单选择排序6、堆排序(选作)7、归并排序(选作)8、基数排序(选作)9、其他要求:1、测试数据分成三类:正序、逆序、随机数据2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换计为3次移动)。3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微秒(选作)4、对2和3的结果进行分析,验证上述各种算法的时间复杂度编写测试main()函数测试线性表的正确性。2程序分析与关键代码1存储结构存储结构:一维数组2.2关键算法分析直接插入排序:数组分为有序区与无序区,初始时首个元素为有序。从第二个元素开始,每个元素一趟,顺序查找获得插入点。一趟实现,将待插入记录赋值给哨兵r[0],从后向前进行顺序查找,元素后移。代码实现if(r[i]<r[i-l])//若r[i]就是最大的元素,则直接进行下一趟排序r[O]=r[i];〃待插入元素赋值给r[0]r[i]=r[i-l]:for(intj=i-2;r[0]<r[j];j-)〃从后向前进行顺序查找,元素后移r[j+l]=r[j];r[j+l]=r[O];希尔排序:将数组分成两份,将第一份数组的元素与哨兵比较,若其大于哨兵,将其值赋给哨兵,哨兵与第二份数组元素比较,将较大的值赋给第二份数组,循环进行,将数组拆分。关键代码for(inti=d+l;i<=n;i++)//一趟希尔排序r[0]=r[i];intj;for(j=i-d;j>O&&r[O]<r[j];j=j-d)r[j+d]=r[j];r[j+d]=r[O];改进的冒泡排序:排序过程分为有序区与无序区,一趟冒泡排序将一个元素由无序区添加到有序区,初试有序区为空,将无序区由前向后依次将相邻元素关键码进戶比较,正序不变,反序交换,关键码大的逐渐后移,重复比较,直至结尾。为去除对无序区中部分有序元素的无用比较,将前一趟最后交换位置定为pos,若前一趟排序没有元素交换,即排好序,排序算法结束。关键代码:intpos=n;while(pos!=0)intbound=pos;//将前一趟最后父换位置定为pos,即无序兀素范围pos=0;//设置本趟排序元素交换起始位置for(inti=l;i<bound;i++)!if(r[i]>r[i+l])//相邻比较Ir[0]=r[i];r[i]=r[i+l];r[i+l]=r[0];//交换pos=i;//记录本次交换位置快速排序:选取轴值,将排序元素分为两个区,左侧关键码小于轴值,右侧大于轴值,在各个小分区重复上述过程,直至有序。选取轴值,比较高低指针指向元素,若指针保持前后顺序,且后指针元素大于标准值,后指针前移,重新比较。否则后面元素赋给前面元素,若后指针元素小于标准值,前指针后移,重新比较,否则前面元素赋给后面元素。左右侧如此扫描,重复,直至左右侧值相等,排序结束。代码实现一趟快排intSORT::Partion(intr[],intfirst,intend)//一趟'快有Einti=first;〃分区的左界intj=end;〃分区的右界intpivot=r[i];〃保存第一个元素,作为基准元素while(i<j)1while((i<j)&&(r[j]>=pivot))//右侧扫描,寻找<pivot的兀素前移1j—;Cnum++;Ir[i]=r[j];while((i<j)&&(r[i]<=pivot))//左侧扫描,寻找>pivot的兀素后移!i++;Cnum++;r[j]=r[i];r[i]=pivot;//将轴值移动到i=j的位置returni;//返回分区的分界值i5.简单选择排序:仍将待排序数列分为有序区与无序区,一趟扫描,获得数组中最小的元素,序区中(即将最小数据与第一个数据交换,将有序区放置在数组前部分。序区数据,每次获得最小的数据,并置于有序区中。扫描数组,交换,为关键算法。代码实现一趟排序:intindex=i;//查找最小记录的位置indexfor(intj=i+l;j<=n;j++)!compare++;if(r[j]<r[index])将其置于有则不用交换if(index!=i)//若第一就是最小元素,index=j;[o]=r[i]:r[i]=rtindex];r[index]=r[0];}6.堆有E序:在简单选择排序一趟结束时,堆排序能够保留其比较结果,减少比较次数,提高排序效率。实现方法需建立大根堆或者小根堆,通过对建成的堆进行排序。关键算法为建堆,排序,如小根堆。生成