1、信息工程学院设计性实验报告 专业:计算机科学与技术 班级:15级计科二班 2016-2017-1 课程名称 数据结构与算法实验 指导教师 朱振伸 本组成员 学号姓名 学号: 1501110241 姓名:刘翱寒 实验地点 XK2-413 实验时间 2016.12.22 实验名称 内部排序 实验类型 设计性 一、 实验目的 1.掌握排序的有关概念和特点。 2.掌握常见的排序算法的思想及其适用条件。 3.掌握常见的排序算法的程序实现。 二、实验设备 Microsoft Visual C++6.0
2、
三、实验内容
输入一组关键字序列分别实现直接插入排序、折半插入排序和希尔排序算法。实现冒泡排序和快速排序算法。实现简单选择排序和堆排序算法.实现归并排序算法。试用各种排序算法进行排序。
四、实验步骤
#include
3、m2移动次数 void readln(){//用文件读入待排序数据 int i; FILE *f1; f1=fopen("a300.txt","r"); fscanf(f1,"%d",&n); for(i=1;i<=n;i++){ a[i].node=i; fscanf(f1,"%d",&a[i].data); } fclose(f1
4、);
}
void bubblesort(){//冒泡排序
int i,j;
dtype t;
for(i=n-1;i;i--)
for(j=i;j
5、 t=a[j];a[j]=a[j+1];a[j+1]=t;sum2++;
}
}
}
void qsort(int l,int r){//快速排序
int i,j,m;
dtype t;
i=l;j=r;m=a[l].data;sum2++;
while(i<=j){
while(a[i].data 6、 while(a[j].data>m)j--,sum1++;
if(i<=j){
t=a[i];a[i]=a[j];a[j]=t;
i++;j--;sum2++;
}
}
if(j>l)qsort(l,j); 7、
if(i 8、 }while(a[j].data>m)
a[j+1]=a[0];
sum2++;
}
}
void shellsort(int d){//隔了d个数的插入排序
int i,j,m,k;
for( 9、i=1;i
for(j=i+d;j<=n;j+=d){
a[0]=a[j];
m=a[0].data;
k=j-d;sum2++;
while(k>0&&a[k].data>m){
a[k+d]=a[k];
k-=d;su 10、m2++;sum1++;
}
a[k+d]=a[0];sum2++;
}
}
void shells(){//希尔排序
int i,m,d[100];
printf("Input the sum of your shellarray:\n");
scanf("%d",&m);
printf("Input your shellarray:\n");
for(i=1 11、i<=m;i++)
scanf("%d",&d[i]);
while(getchar()!=10);
for(i=m;i;i--)shellsort(d[i]);
}
void selectsort(){//选择排序
int i,j,k,m;
dtype t;
for(i=1;i 12、 sum1++;
if(a[j].data 13、hile(a[i/2].data 14、
}
if(a[2*j].data>m)
if(a[2*j+1].data>a[2*j].data){a[j]=a[2*j+1];j=2*j+1;}
else{a[j]=a[2*j];j=2*j;}
Else
if(a[2*j+1].data>m){a[j]=a[2*j+1];j=2*j+1;}
else break;
} if(2*j==i)
15、 if(a[2*j].data>m){a[j]=a[2*j];j=2*j;sum2++;}
a[j]=a[0];sum2++;sum1++; }
void pilesort(){//堆排序
int i;
for(i=2;i<=n;i++) create(i);
for(i=n;i>1;i--) treesort(i);
}
void msort(int l,int r){//归并排序
int i,m,mid;
16、 mid=(l+r+1)/2;
if(mid-1>l)msort(l,mid-1);
if(mid 17、 l++;mid++;if(mid>r)break;
sum1++;sum2++;
}
}
main(){
int c,num,i;
while(1){
sum1=0;sum2=0;
readln();
printf("======================================main======================================");
printf("Press 0 to 18、down sort and else to up sort:\n");
scanf("%d",&c);while(getchar()!=10);
printf("Choose the number to the sorts\n");
printf("0.nosort\n");
printf("1.bubblesort\n");printf("2.quicksort\n");
printf("3.insertsort\n");printf("4.shellsort\n");
19、 printf("5.selectsort\n");printf("6.pilesort\n");
printf("7.mergesort\n");printf("else to exit\n");
scanf("%d",&num);while(getchar()!=10);
switch(num){
case 0:break;
case 1:bubblesort();break;
case 2:qsort(1,n);break;
20、 case 3:insertsort();break;
case 4:shells();break;
case 5:selectsort();break;
case 6:pilesort();break;
case 7:msort(1,n);break;
default:exit(1); }
printf("======================================data======================== 21、");
if(c)
for(i=1;i<=n;i++)printf("%d\t",a[i].data);
else for(i=n;i;i--)
printf("%d\t",a[i].data);
putchar(10);
printf("Here is the times of the compare:\n%d\n",sum1);
printf("Here is the times of th 22、e movement:\n%d\n",sum2);
while(getchar()!=10);
system("CLS");
}
}
运行如下:
六、实验总结
这次试验是我对排序运算有了深刻的理解, 在程序编译和链接时还报了一些错,最后我对排序运算有了更深刻的理解,对我们课堂上的知识进行回顾。 在程序编译和链接时还报了一些错,最后通过一步一步的测试,也很快解决了问题。通过这次程序我感觉我对C++调试有个很深的理解,对程序的调试有了很多心得,也对我的程序调试和编写有了进一步的提高。
同时对C++编程进一步熟悉,对数据结构有了一个整体的认识,对各种排序中函数成员实现的原理、代码进一步了解。对各种排序的优缺点有了进一步的认识和了解。 在这个程序中,我觉得下一步程序可以进一步对时间复杂度进行优化,通过将程序的冗长的代码删除,优化算法等,让程序得到结果所需要的时间更短、更快,删除一些代码,让程序的空间复杂度和时间复杂度都减小。
教师签名:
年 月 日






