数据结构实验报告四Word格式文档下载.docx
《数据结构实验报告四Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告四Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
提示:
使用随机数发生器产生随机测试数据;
使用系统时钟测量运行时间。
要求:
(1)理解和掌握各种基本排序算法;
(2)学会测量和分析排序算法的时间和空间性能;
(3)改进快速排序算法,理解改进的理由,验证算法改进的效果。
二、实验环境(实验设备)
硬件:
微型计算机
软件:
Windows操作系统、MicrosoftVisualC++6.0
三、实验原理及内容
1、
2、源代码
#include<
iostream>
time.h>
usingnamespacestd;
template<
classT>
voidSwap(T&
a,T&
b)
{//交换两个数值
Ttemp;
temp=a;
a=b;
b=temp;
}
voidSelectSort(TA[],intn)
{//简单选择排序
intsmall,i,j;
for(i=0;
i<
n-1;
i++){
small=i;
for(j=i+1;
j<
n;
j++){
if(A[j]<
A[small])
small=j;
}
Swap(A[i],A[small]);
}
voidInsertSort(TA[],intn)
{//直接插入排序
for(inti=1;
i++){
intj=i;
Ttemp=A[i];
while(j>
0&
&
temp<
A[j-1]){
A[j]=A[j-1];
j--;
}
A[j]=temp;
voidBubbleSort(TA[],intn)
{//冒泡排序
inti,j,last;
i=n-1;
while(i>
0){
last=0;
for(j=0;
i;
if(A[j+1]<
A[j]){
Swap(A[j],A[j+1]);
last=j;
}
i=last;
voidQuickSort(TA[],intn)
{//快速排序
QSort(A,0,n-1);
voidQSort(TA[],intleft,intright)
{
inti,j;
if(left<
right){
i=left;
j=right+1;
do{
doi++;
while(A[i]<
A[left]&
=right);
doj--;
while(A[j]>
j>
=left);
if(i<
j)
Swap(A[i],A[j]);
}while(i<
j);
Swap(A[left],A[j]);
QSort(A,left,j-1);
QSort(A,j+1,right);
voidMerge(TA[],inti1,intj1,inti2,intj2)
{//两路合并排序
T*temp=newT[j2-i1+1];
inti=i1,j=i2,k=0;
while(i<
=j1&
=j2){
if(A[i]<
=A[j])
temp[k++]=A[i++];
else
temp[k++]=A[j++];
while(i<
=j1)
temp[k++]=A[i++];
while(j<
j2)
temp[k++]=A[j++];
k;
i++)
A[i1++]=temp[i];
delete[]temp;
voidMergeSort(TA[],intn)
inti1,j1,i2,j2;
intsize=1;
while(size<
n){
i1=0;
while(i1+size<
i2=i1+size;
j1=i2-1;
if(i2+size-1>
n-1)
j2=n-1;
else
j2=i2+size-1;
Merge(A,i1,j1,i2,j2);
i1=j2+1;
size*=2;
voidAdjustDown(TA[],intr,intj)
{//堆排序
intchild=2*r+1;
Ttemp=A[r];
while(child<
=j){
if(child<
j&
A[child]<
A[child+1])
child++;
if(temp>
=A[child])
break;
A[(child-1)/2]=A[child];
child=2*child+1;
A[(child-1)/2]=temp;
voidHeapSort(TA[],intn)
for(inti=(n-1)/2;
i>
-1;
i--)//调整为最大堆
AdjustDown(A,i,n-1);
for(i=n-1;
0;
i--){
Swap(A[0],A[i]);
AdjustDown(A,0,i-1);
voidCopy(TA[],TB[],intn)
{//将A数组复制到B数组中
for(inti=0;
B[i]=A[i];
voidPrint(TA[],intn)
{//输出数组中的值
cout<
<
A[i]<
"
"
;
voidDataGen(TA[],intn)
{//生成随机数
inti=0;
srand((unsigned)time(NULL));
A[i]=rand()*rand();
voidmain()
intn=60000;
int*A=newint[n];
int*B=newint[n];
clock_tstart,finish;
doubleelaps;
DataGen(A,n);
cout<
共输出随机数"
n<
个"
endl<
endl;
尚未排序前:
\n"
Copy(A,B,n);
start=clock();
QuickSort(B,n);
finish=clock();
elaps=(double)(finish-start)/CLOCKS_PER_SEC;
--------4.快速排序--------\n"
elaps<
ms"
Print(B,n);
MergeSort(B,n);
--------5.两路合并排序--------\n"
HeapSort(B,n);
--------6.堆排序--------\n"
SelectSort(B,n);
--------1.简单选择排序--------\n"
InsertSort(B,n);
--------2.直接插入排序--------\n"
BubbleSort(B,n);
--------3.冒泡排序--------\n"
3、给出测试数据及运行结果、实验相关结论等。
简单选择排序:
4422ms
直接插入排序:
2375ms
冒泡排序:
10671ms
快速排序:
16ms
两路合并排序:
31ms
四、实验小结(包括问题和解决方法、心得体会、意见与建议等)
说明:
这部分内容主要包括:
在编程、调试或测试过程中遇到的问题及解决方法、本次实验的心得体会、进一步改进的设想等。
(一)实验中遇到的主要问题及解决方法
.在进行代码输入时,没有注意到大小写、符号等,导致程序无法运行。
(二)实验心得
通过这次数据结构的实验,我了解到了数据结构不仅仅是一门理论学科,更是一门实践性的学科。
在实验过程中我发现了我的许多不足之处,如算法的不完善、语法的错误、语句的不通顺等等。
在调试程序时,经常出现因为粗心大意而犯的低级错误,导致程序不能运行,耗费了大量时间去寻找并修改这些错误。
同时,在进行程序设计时,要注意想好思路。
将每个函数的功能都要清晰的表述出来,使人能够一目了然此程序的功能。
但是完成任何一个较大的程序,都需要掌握一定的编程基础,需要不断的探索和求知过程,这样对自己编程能力的提高有较大的帮助。
当然,任何程序必须经过计算机的调试,看是否调试成功,发现错误,一个个,一步步去解决,这样就能从错误中进步。
通过实验加强了我的动手能力,以及提升了局部和统一考虑问题的思维方式。
这次的实验不仅让我巩固了以前所学过的c++知识,而且学到了很多在书本上所没有提及的知识。
通过这次实验我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正提高自己的能力。
以后要多多研读数据结构这方面的书,不断提高自己的能力,能够较为轻松的完成此类实验课题。
通过这次的课程设计,我深入理解了线性表数据结构,掌握了线性表的顺序和链接两种存储表示方法。
掌握了顺序表的各种基本操作。
学会了使用线性表解决应用问题的方法。
加深了对抽象模板类、类的继承、代码重用、重载等C++语言机制的理解和使用。
五、指导教师评语
成绩
批阅人
日期