排序实验报告
- 格式:doc
- 大小:375.05 KB
- 文档页数:17
{
printf("打开文件失败!\n");
exit(1);
}
for(i=1;i<=L.length;i++)
fprintf(fp,"%d ",L.r[i]);
fclose(fp);
return OK;
}//InitList_Sq
算法的时间复杂度分析:O(n)
2、Insertsort()
主控菜单项选择函数menu()
创建排序表函数InitList_Sq()
对顺序表L进行直接插入排序函数Insertsort()
希尔排序函数ShellSort();
起泡排序函数Bubble_sort()
快速排序函数QSort ( )
简单选择排序函数SelectSort()
(三)函数调用关系
程序的主要结构(函数调用关系)如下图所示。
{ L.r[0]=L.r[i]; //复制为“哨兵”,暂存
for (int j=i-1;LT(L.r[0].key,L.r[j].key);j--)
L.r[j+1]=L.r[j];
//位置j指示了第一个key≤L.r[i].key的元素
L.r[j+1]=L.r[0]; //将暂存在r[0]中的记录插入到正确位置
6、Partition()
算法原理:从n个待排记录中任取一个记录Ri作标准,调整序列中各个记录的位置,使得:排在ri前的记录排序码<=ri.key排在ri后的排序码,该过程为一趟快速排序。这样就确定了Ri在序列中的最终位置,同时将序列分成两个子序列。
流程图:开始
L.r[0]=L.r[low]
Pivotkey=L.r[low].key
Menu()InitList_Sq(L)
Main()
Insertsort(L)ShellSort()Bubble_sort()QSort ( )SelectSort()
其中main()是主函数,它进行菜单驱动,根据选择项0~5调用相应的函数。main()函数使用for循环实现重复选择。其循环结构如下:
}}
算法的时间复杂度分析:O(n2)
3、ShellInsert()
算法原理:1、分组、组内直接插入排序;2、组数逐次减小;3、组数=1,结束。
流程图:开始
i=dk+1
i<L.length否
是
L.r [i].key <L.r [i-dk].key否
是
L.r [0]=L.r [i]
j=i-dk
(j>0)&&(LT(L.r [0].key ,L.r [j].key )否
if(fp==NULL)//打开文件失败
{
printf("打开文件失败!\n");
exit(1);
}
for(i=1;i<=L.length;i++)
fprintf(fp,"%d ",L.r[i]);
fclose(fp);
break;
case 0:
printf("\t退出!\n");
return ;
}
}
(四)文件结构
1、sort.h:顺序表相关的定义与函数声明
2、sort.cpp:顺序表排序运算的实现
3、menu.h:主菜单函数的声明
4、menu.cpp:主菜单函数的实现
5、mn.cpp:主函数
(五)各函数的算法设计
1、InitList_Sq()
算法原理:数组指针r指示线性表的基址,length指示线性表的当前长度,将随机生成的数赋给线性表,并生成相应文件。
四、功能设计
(一)主控菜单设计
为实现通各种排序的功能,首先设计一个含有多个菜单项的主控菜单程序,然后再为这些菜单项配上相应的功能。
程序运行后,给出6个菜单项的内容和输入提示,如下:
1.直接插入排序
2.希尔排序
3.起泡排序
4.快速排序
5.简单选择排序
0.退出系统
(二)程序模块结构
由课题要求可将程序划分为以下几个模块(即实现程序功能所需的函数):
j--
flag=0
i++
结束
代码描述:void Bubble_sort(SqList &L)
{
RedType x;
int n;
n=L.length; //表长
for (int i=1; i<n; i++)
{ int flag=0; //进入循环,清标志
for (int j=n-1; j>=i; j--)
是
L.r [j+dk]=L.r [j]
j-=dk
L.r [j+dk]=L.r [0]
i++
结束
代码描述:void ShellInsert(SqList &L,int dk)
{ //一趟Shell排序,dk为步长
int i;
for(i=dk+1;i<=L.length;i++)
{
if(LT(L.r [i].key ,L.r [i-dk].key ))
k++
结束
代码描述:void ShellSort(SqList &L,int dlta[],int t)
{ //Shell排序,dlta[]为增量序列,t为增量个数
int k;
for(k=0;k<t;k++)
ShellInsert(L,dlta[k]);
}// ShellSort
算法的时间复杂度分析:O(n(㏒2n)2)
算法原理:每步将一个待排序的对象,按其排序码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。在已形成的有序表中顺序查找,并在适当位置插入,把原来位置上的元素向后顺移。
流程图:开始
i=2
i<L.length否
是
L.r[i].key<L.r[i-1].key否
是
L.r[0]=L.r[i]
QSort (L,0,L.length );
end=clock();
printf("%d ms\n",end-start);
fp=fopen("D:快速排序.txt","w");
if(fp==NULL)//打开文件失败
{
printf("打开文件失败!\n");
exit(1);
}
for(i=1;i<=L.length;i++)
fprintf(fp,"%d ",L.r[i]);
fclose(fp);
break;
case 5:
printf("*简单选择排序*\n");
start=clock();
SelectSort(L);
end=clock();
printf("%d ms\n",end-start);
fp=fopen("D:简单选择排序.txt","w");
if (! L.r) exit(OVERFLOW); //存储分配失败
L.length=30001; //表长度为30001
srand((unsigned)time(NULL));
for(int i=1;i<=L.length;i++)
L.r[i].key=rand()%30001+1;
fp=fopen("D:构造一个线性表.txt","w");
流程图:开始
申请内存
随机生成30000个数字
生成文件
Fp=NULL
将顺序表打印到文件内终止程序
关闭文件
结束
代码描述:Status InitList_Sq(SqList &L)
{ //构造一个线性表
FILE *fp;
L.r=(RedType *) malloc(LIST_INIT_SIZE*sizeof(RedType));
if(fp==NULL)//打开文件失败
{
printf("打开文件失败!\n");
exit(1);
}
for(i=1;i<=L.length;i++)
fprintf(fp,"%d ",L.r[i]);
fclose(fp);
break;
case 2:
printf("*希尔排序*\n");
start=clock();
j=i-1
L.r[0].key<L.r[j].key否
是
L.[j+1]=L.r[j]
j--
L.r[j+1]=L.r[0]
i++
结束
代码描述:void Insertsort(SqList &L) //对顺序表L进行直接插入排序
{ for(int i=2;i<=L.length;i++)
if (LT(L.r[i].key,L.r[i-1].key)) //需将L.r[i]插入有序表
《数据结构》
课程设计报告
专业计算机科学与技术
班级
姓名
学号
指导教师
起止时间2012.12~2013.1
课程设计:排序综合
一、任务描述
排序综合
任务:利用随机函数产生n个随机整数(20000以上),对这些数进行多种方法进行排序。