内部排序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构实习报告

题目:内部排序算法比较
班级: 1403011
姓名:刘瑗
学号:14030110011
一、需求分析
1.问题描述:在课本中,各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶数或大概执行时间。试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。
2.基本要求:
(1)对以下6种常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序。
(2)待排序表的表长不小于100;其中的数据要用伪随机数函数产生;比较的指标为有关键字参加的比较次数和关键字的移动次数(其中关键字交换计为3次移动)。
(3)最后要对结果做出简单分析,包括对各组数据得出结果波动大小的解释。
3.测试数据:由随机数产生函数生成。

二、概要设计
1.本程序的主要模块有主程序模块和基本操作模块
(1).主程序模块
Int mian()
{打印表头;
While(1){
接受命令;
生成随机数;
执行命令;
}退出;
}
(2).基本操作模块
随机数排序: 至少重复执行5次取平均

三、详细设计
#include
#include
#include
#define MAXNUM 1000//定义随机数最大为1000
#define N 150//定义数组最大为150
#define t 3//定义希尔排序次数

int qmt;//快速排序的移动次数
int qct;//快速排序的比较次数
int d[t]={4,3,1};//定义希尔排序比较量

void output(int n,int a[],int ct,int mt)//内部排序中调用的输出函数
{
int i;
printf("\n排序结果:");
for( i=0;iprintf("%d ",a[i]);//输出各排序完成的数组
printf("\n\n比较次数:%d 移动次数:%d\n",ct,mt);
}

void bubble_sort(int n,int A[])//冒泡排序
{
int mt=0;//移动次数mt=movetime
int ct=0;//比较次数ct=cmdtime
int i,j,temp;
int a[N];
for(i=0;ia[i]=A[i];
for(i=0;i{
for(j=0;j{
if(a[j+1]temp=a[j],
a[j]=a[j+1],
a[j+1]=temp,
mt+=3;//关键字交换计为3次移动
}
}
printf("\n冒泡排序");
output(n,a,ct,mt);
}

void selection_sort(int n,int A[])//选择排序
{
int mt=0;//移动次数movetime
int ct=0;//比较次数cmdtime
int i,j,temp,k;
int a[N];
for(i=0;ia[i]=A[i];
for(i=0;i{
k=i;
for(j=i+1;jif(a[k]>a[j])
k=j;
temp=a[i],
a[i]=a[k],
a[k]=temp,
mt+=3;//关键字交换计为3次移动
}
printf("\n选择排序");
output(n,a,ct,mt);
}

void quick(int a[],int low,int up)//快速排序递归算法
{
int i,j,temp;
if(low{
i=low;
j=up;
temp=a[low],
qmt++;
while(i!=j)
{
qct++;
while(itemp)
j--,qct++;
if(ia[i++]=a[j],qct++;
qmt++;

while(ii++,
qct++;
if(ia[j--]=a[i],
qct++,
qmt++;
}
a[i]=temp,
qmt++;
quick(a,low,j-1);
quick(a,i+1,up);
}
}

void quick_sort(int n,int A[])//快速排序(通过调用快速排序递归算法完成)
{
int i;
int a[N];
qct=0;
qmt=0;
for(i=0;ia[i]=A[i];
quick(a,0,n-1);//调用快速排序递归算法
printf("\n快速排序");
output(n,a,qct,qmt);
}

void insertion_sort(int n,int A[])//插入排序
{
int mt=0;//移动次数movetime
int ct=0;//比较次数cmdtime
int i,j,temp;
int a[N];
for(i=0;ia[i]=A[i];
for(i=1;i{
temp=a[i],
mt++;
for(j=i-1;j>=0&&tempa[j+1]=a[j],
mt++;
a[j+1]=temp,
mt++;
}
printf("\n插入排序");
output(n,a,ct,mt);

}

void shell_sort(int n,int A[])//希尔排序
{
int mt=0;//移动次数movetime
int ct=0;//比较次数cmdtime
int i,j,k,h,y;
int a[N];
for(i=0;ia[i]=A[i];
for(i=0;i{
h=d[i];
for(j=h;j{
y=a[j],
mt++;
for(k=j-h,ct++,mt++;k>=0&&ya[k+h]=a[k];
a[k+h]=y;
}
}
printf("\n希尔排序");
output(n,a,ct,mt);
}

int main()
{
int n=N;
int i,j=0,choice=0;
int A[N];//B[N],C[N],D[N],E[N],
srand((unsigned) time(NULL));

printf("\n*******************内部排序算法比较*******************");
while(choice!=7)
{
printf("\n菜单:");
printf("\n 1.生成随机数序列");
printf("\n 2.冒泡排序");
printf("\n 3.选择排序");
printf("\n 4.快速排序");
printf("\n 5.插入排序");
printf("\n 6.希尔排序");
printf("\n 7.退出\n请选择:");
scanf("%d",&choice);
switch(choice)
{
case 1:
j++;
printf("\n*******************第%d组随机数*******************\n数组序列:",j);
for(i=0;i{
A[i]=rand()%MAXNUM;
}
for(i=0;i{
printf("%d ",A[i]);
}
printf("\n\n");
break;
case 2:
bubble_sort(n,A);//冒泡排序
break;
case 3:
selection_sort(n,A);//选择排序
break;
case 4:
quick_sort(n,A);//快速排序
break;
case 5:
insertion_sort(n,A);//插入排序
break;
case 6:
shell_sort(n,A);//希尔排序
break;
case 7:
printf("\t\t\t再见!\n");
break;
default:
printf("输入错误,请重新选择\n");
break;
}
}
return 0;
}
四、用户手册
1. 本程序的运行环绕为WINDOWS环境下的仿真DOS系统,执行文件compare.exe。
2. 进入演示程序后即显示文本方式的用户界面。
3. 根据提示输入相应的命令。
4.接受命令后即执行相应运算和显示相应结果。

六、测试结果
理论分析可以得出各种排序算法的时间复杂度和空间复杂度,如下表所示:
排序方法 平均情况 最好情况 最坏情况 辅助空间

直接插入排序 O(n2) O(n) O(n2) O(1)
起泡排序 O(n2) O (n) O(n2) O(1)
快速排序 O(nlog2n) O(nlog2n) O(n2) O(log2n) ~O(n)
简单选择排序 O(n2) O(n2) O(n2) O(1)
希尔排序 O(n1..3) O(1)

从结果中可看出:
对于一般的排序,比较次数多,而交换次数相对较少;而快速排序比较次数和交换次数都较少,两者相差不如前者大。其中冒泡排序比较和交换次数都很大。正序、逆序等典型数据对结果影响较大。

七、附录 源程序文件名清单
内部排序.c //程序代码文件


相关文档
最新文档