1、数据结构实验报告四实 验 报 告(2014 / 2015 学年 第 二 学期)课程名称数据结构A实验名称基本内排序算法的验证和性能比较,改进快速排序算法实验时间年月日指导单位指导教师学生姓名班级学号学院(系)专 业 实 验 报 告实验名称基本内排序算法的验证和性能比较,改进快速排序算法指导教师实验类型设计实验学时2实验时间一、 实验目的和要求(1)验证内排序算法,分析算法的时间性能验证各种基本排序算法分析各算法的最好、最坏和平均情况时间复杂度,以渐近表示法表示。产生不同规模和排列状态的数据集,测量算法的实际执行时间;比较理论分析和实际运行时间,解释理由。提示:使用随机数发生器产生随机测试数据;
2、使用系统时钟测量运行时间。 要求:(1)理解和掌握各种基本排序算法;(2)学会测量和分析排序算法的时间和空间性能;(3)改进快速排序算法,理解改进的理由,验证算法改进的效果。二、实验环境(实验设备)硬件:微型计算机软件:Windows 操作系统、Microsoft Visual C+6.0三、实验原理及内容1、实 验 报 告2、源代码#include #include using namespace std;template void Swap(T &a, T &b) /交换两个数值 T temp; temp = a; a = b; b = temp;template void SelectS
3、ort(T A, int n) /简单选择排序 int small, i, j; for (i = 0; i n-1; i+) small = i; for (j = i+1; j n; j+) if (Aj Asmall) small = j; Swap(Ai, Asmall); template void InsertSort(T A, int n) /直接插入排序 for (int i = 1; i 0 & temp Aj-1) Aj = Aj-1; j-; Aj = temp; template void BubbleSort(T A, int n) /冒泡排序 int i, j, l
4、ast; i = n-1; while (i 0) last = 0; for(j = 0; j i; j+) if (Aj+1 Aj) Swap(Aj, Aj+1); last = j; i = last; template void QuickSort(T A, int n)/快速排序 QSort(A, 0, n-1);template void QSort(T A, int left, int right) int i, j; if (left right) i = left; j = right +1; do do i+; while (Ai Aleft & i Aleft & j =
5、 left); if (i j) Swap(Ai, Aj); while (i j); Swap(Aleft, Aj); QSort(A, left, j-1); QSort(A, j+1, right); template void Merge(T A, int i1, int j1, int i2, int j2)/两路合并排序 T *temp = new Tj2 - i1 + 1; int i = i1, j = i2, k = 0; while (i = j1 & j = j2) if (Ai = Aj) tempk+ = Ai+; else tempk+ = Aj+; while(i
6、 = j1) tempk+ = Ai+; while(j j2) tempk+ = Aj+; for (i = 0; i k; i+) Ai1+ = tempi; delete temp;template void MergeSort(T A, int n) int i1, j1, i2, j2; int size = 1; while (size n) i1 = 0; while (i1 + size n - 1) j2 = n-1; else j2 = i2 + size -1; Merge(A, i1, j1, i2, j2); i1 = j2 +1; size *= 2; templa
7、te void AdjustDown(T A, int r, int j)/堆排序 int child = 2*r+1; T temp = Ar; while(child = j) if(child j & Achild = Achild) break; A(child-1)/2 = Achild; child = 2 * child + 1; A(child-1)/2 = temp;template void HeapSort(T A, int n) for (int i = (n-1)/2; i-1; i-) / 调整为最大堆 AdjustDown(A, i, n-1); for(i=n-
8、1; i0; i-) Swap(A0, Ai); AdjustDown(A, 0, i-1); template void Copy(T A, T B, int n)/将A数组复制到B数组中 for (int i = 0; i n; i+) Bi = Ai;template void Print(T A, int n)/输出数组中的值 for (int i = 0; i n; i+) coutAi ;template void DataGen(T A, int n)/生成随机数 int i = 0; srand(unsigned) time(NULL); for (i = 0; i n; i+
9、) Ai = rand()*rand(); void main() int n = 60000; int *A = new intn; int *B = new intn; int i = 0; clock_t start, finish; double elaps; DataGen(A, n); cout 共输出随机数n个endlendl; cout尚未排序前:n; for (i = 0; i n; i+) coutAi ; coutendl; Copy(A, B, n); start = clock(); QuickSort(B, n); finish = clock(); elaps =
10、 (double) (finish-start)/CLOCKS_PER_SEC; cout-4.快速排序-nelaps msendl; Print(B, n); coutendl; Copy(A, B, n); start = clock(); MergeSort(B, n); finish = clock(); elaps = (double) (finish-start)/CLOCKS_PER_SEC; cout-5.两路合并排序-nelaps msendl; Print(B, n); coutendl; Copy(A, B, n); start = clock(); HeapSort(B
11、, n); finish = clock(); elaps = (double) (finish-start)/CLOCKS_PER_SEC; cout-6.堆排序-nelaps msendl; Print(B, n); coutendl; Copy(A, B, n); start = clock(); SelectSort(B, n); finish = clock(); elaps = (double) (finish-start)/CLOCKS_PER_SEC; cout-1.简单选择排序-nelaps msendl; Print(B, n); coutendl; Copy(A, B,
12、n); start = clock(); InsertSort(B, n); finish = clock(); elaps = (double) (finish-start)/CLOCKS_PER_SEC; cout-2.直接插入排序-nelaps msendl; Print(B, n); coutendl; Copy(A, B, n); start = clock(); BubbleSort(B, n); finish = clock(); elaps = (double) (finish-start)/CLOCKS_PER_SEC; cout-3.冒泡排序-nelaps msendl;
13、Print(B, n); coutendl;3、给出测试数据及运行结果、实验相关结论等。简单选择排序:4422ms直接插入排序:2375ms冒泡排序:10671ms快速排序:16ms两路合并排序:31ms 实 验 报 告实 验 报 告四、实验小结(包括问题和解决方法、心得体会、意见与建议等)说明:这部分内容主要包括:在编程、调试或测试过程中遇到的问题及解决方法、本次实验的心得体会、进一步改进的设想等。(一)实验中遇到的主要问题及解决方法.在进行代码输入时,没有注意到大小写、符号等,导致程序无法运行。(二)实验心得通过这次数据结构的实验,我了解到了数据结构不仅仅是一门理论学科,更是一门实践性的学
14、科。在实验过程中我发现了我的许多不足之处,如算法的不完善、语法的错误、语句的不通顺等等。在调试程序时,经常出现因为粗心大意而犯的低级错误,导致程序不能运行,耗费了大量时间去寻找并修改这些错误。同时,在进行程序设计时,要注意想好思路。将每个函数的功能都要清晰的表述出来,使人能够一目了然此程序的功能。但是完成任何一个较大的程序,都需要掌握一定的编程基础,需要不断的探索和求知过程,这样对自己编程能力的提高有较大的帮助。当然,任何程序必须经过计算机的调试,看是否调试成功,发现错误,一个个,一步步去解决,这样就能从错误中进步。 通过实验加强了我的动手能力,以及提升了局部和统一考虑问题的思维方式。这次的实验不仅让我巩固了以前所学过的c+知识,而且学到了很多在书本上所没有提及的知识。通过这次实验我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正提高自己的能力。 以后要多多研读数据结构这方面的书,不断提高自己的能力,能够较为轻松的完成此类实验课题。通过这次的课程设计,我深入理解了线性表数据结构,掌握了线性表的顺序和链接两种存储表示方法。掌握了顺序表的各种基本操作。学会了使用线性表解决应用问题的方法。加深了对抽象模板类、类的继承、代码重用、重载等C+语言机制的理解和使用。五、指导教师评语成 绩批阅人日 期
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1