北邮数据结构实验报告排序Word文档格式.docx
- 文档编号:19675092
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:18
- 大小:143.37KB
北邮数据结构实验报告排序Word文档格式.docx
《北邮数据结构实验报告排序Word文档格式.docx》由会员分享,可在线阅读,更多相关《北邮数据结构实验报告排序Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
6、堆排序(选作)
7、归并排序(选作)
8、基数排序(选作)
9、其他
要求:
1、测试数据分成三类:
正序、逆序、随机数据
2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换计为3次移动)。
3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微秒(选作)
4、对2和3的结果进行分析,验证上述各种算法的时间复杂度
编写测试main()函数测试线性表的正确性。
3程序分析
3.1
存储结构
顺序存储结构——数组
3.2
关键算法分析
1.插入排序:
依次将待排序的序列中的每一个记录插入到先前排序好的序列中,直到全部记录排序完毕
voidInsertsort(intr[],intn,int*compare,int*move)//插入排序
{
*compare=0;
*move=0;
inti;
intj;
for(i=1;
i<
n;
i++)//一共要排序n-1次
intx=r[i];
for(j=i-1;
x<
r[j]&
&
j>
=0;
j--)
{
(*compare)++;
(*move)++;
r[j+1]=r[j];
}
if(j>
=0)(*compare)++;
r[j+1]=x;
}
2.希尔排序:
先将整个序列分割成若干个子列,分别在各个子列中运用直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序
voidShellInsert(intr[],intn,int*compare,int*move)//希尔排序
1091212202031
for(intd=n/2;
d>
=1;
d=d/2)//间距越来越小
for(inti=d;
=n-1;
i++)//从a[d]往后逐个元素确定是否需要前移
if(r[i]<
r[i-d])//某元素比同组中的前一位小,则需要前移
for(j=i-d;
(j>
=0)&
(x<
r[j]);
j=j-d)//完成所需的所有前移
{
(*compare)++;
(*move)++;
r[j+d]=r[j];
}
r[j+d]=x;
else(*compare)++;
3.冒泡排序:
两两比较相邻记录的关键码,如果反序则交换,直到没有反序记录为止
voidBubblesort(intr[],intn,int*compare,int*move)//交换(冒泡)排序
intx;
for(intj=0;
j<
n-1;
j++)//冒泡排序n-1次
for(inti=n-1;
i>
j;
i--)
r[i-1])
(*compare)++;
(*move)+=3;
x=r[i];
r[i]=r[i-1];
r[i-1]=x;
4.快速排序:
首先选择一个基准,将记录分割为两部分,左支小于或等于基准,右支则大于基准,然后对两部分重复上述过程,直至整个序列排序完成
intPartion(intr[],intfirst,intend,int*compare,int*move)//快速排序中的轴定位
inti=first;
intj=end;
intzhou=r[i];
//默认第一个元素为轴
while(i<
j)
while((i<
j)&
(r[j]>
=zhou))//查看右侧元素与轴的大小关系
j--;
if(i<
(*move)++;
r[i]=r[j];
//发现轴右侧的某数比轴值小,将其前置
(r[i]<
=zhou))//查看左侧元素与轴的大小关系
i++;
r[j]=r[i];
//发现轴左侧的某数比轴值小,将其后置
r[i]=zhou;
//最后确定轴的位置
returni;
voidQsort(intr[],inti,intj,int*compare,int*move)//快速排序
if(i<
intcentre=Partion(r,i,j,compare,move);
Qsort(r,i,centre-1,compare,move);
Qsort(r,centre+1,j,compare,move);
5.选择排序:
从待排序的记录序列中选择关键码最小的记录并将它与序列中的第一个记录交换位置;
然后从不包括第一个位置上的记录序列中选择关键码最小(或最大)的记录并将它与序列中的第二个记录交换位置;
如此重复,直到序列中只剩下一个记录为止
voidSelectsort(intr[],intn,int*compare,int*move)//选择排序
for(inti=0;
i++)//排序n-1次
intmin=i;
for(intj=i+1;
j++)//通过此层循环,找到真正的第i个最小值
if(r[j]<
r[min])min=j;
//记录下当前找到的最小值的位置
if(min!
=i)
(*move)+=3;
intMin;
Min=r[min];
r[min]=r[i];
r[i]=Min;
4程序运行结果
4.1主函数流程图
4.2程序运行框图
5实验心得
1.调试时出现的问题及解决的方法
在初期构思代码的时候,首先构造了各种算法的基本实现代码,封装成类,已经能够实现七种排序的基本功能,并且测试无误。
之后考虑如何能简化代码以实现多达七种排序算法的简单调用、乱序和顺序以及逆序数据的分别排序和性能指标统计(算法移动次数和比较次数的精确统计)。
2.心得体会
程序的优化是一个艰辛的过程,如果只是实现一般的功能,将变得容易很多,当加上优化,不论是效率还是结构优化,都需要精心设计。
3.改进
本程序代码设计时运用了递归的调用方式,效率还可以通过将其转换为栈模拟的方式得以提高。
另外还可以进一步考虑算法时间的精确统计,以便从时间角度比较这几种排序算法的优劣。
完整源代码
#include<
iostream>
usingnamespacestd;
voidInsertsort(intr[],intn,int*compare,int*move);
voidShellInsert(intr[],intn,int*compare,int*move);
voidBubblesort(intr[],intn,int*compare,int*move);
intPartion(intr[],intfirst,intend,int*compare,int*move);
voidQsort(intr[],inti,intj,int*compare,int*move);
voidSelectsort(intr[],intn,int*compare,int*move);
voidmain()
inti;
intcompare=0;
intmove=0;
cout<
<
"
请您先输入一个正序数组哦"
endl;
intn;
请输入数组中含有的元素数量:
;
cin>
>
int*r=newint[n];
请输入数组中的元素:
for(i=0;
i++)cin>
r[i];
int*a=newint[n];
i++){a[i]=r[i];
Insertsort(a,n,&
compare,&
move);
\n插入排序结果为:
i++)cout<
a[i]<
'
'
\n比较次数为"
compare;
\n移动次数为"
move<
\n'
int*b=newint[n];
i++){b[i]=r[i];
ShellInsert(b,n,&
希尔排序结果为:
b[i]<
int*c=newint[n];
i++){c[i]=r[i];
Bubblesort(c,n,&
交换排序结果为:
c[i]<
compare=0;
move=0;
int*d=newint[n];
i++){d[i]=r[i];
Qsort(d,0,n-1,&
快速排序结果为:
d[i]<
int*e=newint[n];
i++){e[i]=r[i];
Selectsort(e,n,&
选择排序结果为:
e[i]<
再输入一个逆序数组~~~"
最后输入一个乱序数组~~~"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告 排序