数据结构报告4.docx
- 文档编号:28987693
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:17
- 大小:108.65KB
数据结构报告4.docx
《数据结构报告4.docx》由会员分享,可在线阅读,更多相关《数据结构报告4.docx(17页珍藏版)》请在冰豆网上搜索。
数据结构报告4
中南大学
数据结构实验报告
目录
1.实验内容3
2.程序设计思路3
3.主要算法4
直接插入排序5
简单选择排序6
气泡排序7
快速排序8
堆排序10
4.运行结果14
5.设计中的问题和解决方案16
数据结构实验报告4
1.实验内容
排序算法的实现:
实现插入、快速、堆排序、归并排序算法。
2.程序设计思路
1、插入排序:
依次将待排序的序列中的每一个记录插入到先前排序好的序列中,直到全部记录排序完毕。
2、希尔排序:
先将整个序列分割成若干个子列,分别在各个子列中运用直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序。
3、冒泡排序:
两两比较相邻记录的关键码,如果反序则交换,直到没有反序记录为止。
4、快速排序:
首先选择一个基准,将记录分割为两部分,左支小于或等于基准,右支则大于基准,然后对两部分重复上述过程,直至整个序列排序完成。
5、选择排序:
从待排序的记录序列中选择关键码最小(或最大)的记录并将它与序列中的第一个记录交换位置;然后从不包括第一个位置上的记录序列中选择关键码最小(或最大)的记录并将它与序列中的第二个记录交换位置;如此重复,直到序列中只剩下一个记录为止。
6、堆排序:
通过建立大根堆或者小根堆,取出根节点,反复调整堆使之保持大根堆或者小根堆,直至最后序列有序。
7、归并排序:
将若干个有序序列两两归并,直至所有待排序的记录都在一个有序序列为止。
3.主要算法
#include
#include
#defineMaxlength51
structCompute//用于统计比较和交换的次数
{
intcompareNum;
intswapNum;
};
typedefintLIST[Maxlength];
usingnamespacestd;
typedefstruct
{
LISTmyheap;
intcount;
}Heap;
Computewhole,whole1,Com;;
voidCreateHeap(Heap&temp)
{
temp.count=0;
}
boolHeapEmpty(Heap&temp)
{
return(!
temp.count);
}
boolHeapFull(Heap&temp)
{
return(temp.count==Maxlength-1);
}
intGenerateNum()//随机生成1~99之间的一个数并返回
{
returnrand()%99+1;
}
voidSwap(int&x,int&y)//传址参数交换两个整数
{
inttemp;
temp=x;
x=y;
y=temp;
}
voidInit(LISTtemp)
{
temp[0]=-1;//引入temp[0],使其小于任何一个元素
for(inti=0;i temp[i]=GenerateNum(); } voidShow(LISTtemp) { for(inti=1;i cout< cout< } voidResult(Computea) { cout< } //直接插入排序 voidInsertionSort(LISTtemp) { //ComputeCom; CpareNum=0; Com.swapNum=0; //cout<<"直接插入排序: "< intj; for(inti=1;i { j=i; while(temp[j] { CpareNum++; Com.swapNum++; inta; a=temp[j]; temp[j]=temp[j-1]; temp[j-1]=a; j--; } CpareNum++; } //Show(temp); Result(Com); } //简单选择排序 voidSelectionSort(LISTtemp) { //ComputeCom; CpareNum=0; Com.swapNum=0; //cout<<"简单选择排序: "< intlowkey; intlowindex; for(inti=1;i { lowindex=i; lowkey=temp[i]; for(intj=i;j { CpareNum++; if(temp[j] { lowkey=temp[j]; lowindex=j; } } Com.swapNum++; inta=temp[lowindex]; temp[lowindex]=temp[i]; temp[i]=a; } //Show(temp); Result(Com); } //气泡排序 voidBubbleSort(LISTtemp) { //ComputeCom; CpareNum=0; Com.swapNum=0; //cout<<"冒泡排序: "< inti,j; for(i=1;i { for(j=Maxlength-1;j>i;j--) { CpareNum++; if(temp[j] { Com.swapNum++; Swap(temp[j],temp[j-1]); } } } //Show(temp); Result(Com); } //快速排序 intFindPivot(inti,intj,LISTtemp) { intfirstkey; intk; firstkey=temp[i]; for(intk=i+1;k<=j;k++) if(temp[k]>firstkey) returnk; elseif(temp[k] returni; return0; } intPartition(inti,intj,intpivot,LISTtemp)//划分temp[i]……temp[j],使关键字小于pivot的在左子序列…… { intleft,right; left=i; right=j; do { while(temp[left] { left++; pareNum++; } pareNum++; while(temp[right]>=pivot) { right--; pareNum++; } pareNum++; if(left { Swap(temp[left],temp[right]); whole.swapNum++; } }while(left returnleft; } voidQuickSort(inti,intj,LISTtemp) { intpivot; intpivotindex; intk;//关键字>=pivot的记录序列的起始下标 pivotindex=FindPivot(i,j,temp); if(pivotindex! =0) { pivot=temp[pivotindex]; k=Partition(i,j,pivot,temp); QuickSort(i,k-1,temp); QuickSort(k,j,temp); } } //堆排序 voidInsert(inta,Heap&temp) { inti; if(! HeapFull(temp)) { i=temp.count+1; temp.count++; while((i! =1)&&(a { whole1.compareNum++; whole1.swapNum++; temp.myheap[i]=temp.myheap[i/2]; i/=2; } whole1.compareNum++; temp.myheap[i]=a; //cout<<"在"< } } intDeletemin(Heap&temp) { intparent=1,child=2; intelement=-2,tmp; if(! HeapEmpty(temp)) { element=temp.myheap[1]; tmp=temp.myheap[temp.count]; temp.count--; while(child<=temp.count) { whole1.compareNum++; if((child { whole1.compareNum++; whole1.swapNum++; child++; } if(tmp<=temp.myheap[child]) { whole1.compareNum++; break; } temp.myheap[parent]=temp.myheap[child]; parent=child; child*=2; } whole1.compareNum++; } temp.myheap[parent]=tmp; returnelement; } voidcopy(LISTtemp6,LISTtemp5,LISTtemp4,LISTtemp3,LISTtemp2,LISTtemp1) { LISTa; for(inti=0;i temp6[i]=temp5[i]=temp4[i]=temp3[i]=temp2[i]=temp1[i]; } //主函数 intmain(intargc,char*argv[]) { srand((unsigned)time(NULL)); LISTFirst,Second,Third; Init(First); Init(Second); Init(Third); LISTf1,f2,f3,f4,f5; LISTs1,s2,s3,s4,s5; LISTt1,t2,t3,t4,t5; copy(f2,f3,f4,f5,f1,First); copy(s1,s2,s3,s4,s5,Second); copy(t1,t2,t3,t4,t5,Third); /*cout<<"生成的随机数组为: "< Show(First); Show(Second); Show(Third);*/ cout<<"\t第一组\t\t第二组\t\t第三组"< cout<<"\t比较\t交换\t比较\t交换\t比较\t交换"< cout<<"插入: "; InsertionSort(f1); InsertionSort(s1); InsertionSort(t1); cout< cout<<"选择: "; SelectionSort(f2); SelectionSort(s2); SelectionSort(t2); cout< cout<<"冒泡: "; BubbleSort(f3); BubbleSort(s3); BubbleSort(t3); cout< cout<<"快速: "; pareNum=0; whole.swapNum=0; QuickSort(1,50,f4); //Show(Third); Result(whole); pareNum=0; whole.swapNum=0; QuickSort(1,50,s4); //Show(Third); Result(whole); pareNum=0; whole.swapNum=0; QuickSort(1,50,t4); //Show(Third); Result(whole); cout< cout<<"堆: "; Heaptemp; CreateHeap(temp); pareNum=0; whole1.swapNum=0; for(inti=1;i<=50;i++) { Insert(f5[i],temp); } for(intj=1;j<=50;j++) Second[j]=Deletemin(temp); Result(whole1); CreateHeap(temp); pareNum=0; whole1.swapNum=0; for(inti=1;i<=50;i++) { Insert(s5[i],temp); } for(intj=1;j<=50;j++) Second[j]=Deletemin(temp); Result(whole1); CreateHeap(temp); pareNum=0; whole1.swapNum=0; for(inti=1;i<=50;i++) { Insert(t5[i],temp); } for(intj=1;j<=50;j++) Second[j]=Deletemin(temp); Result(whole1); cout< system("PAUSE"); returnEXIT_SUCCESS; } 4.运行结果 (1)冒泡排序 (2)快速排序 (3)希尔排序 (4)直接插入排序 (5)简单选择排序 5.设计中的问题和解决方案 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列。 通过这次上机实验,增加了我学习算法的兴趣,虽然还不是很懂,但是已发现程序设计的乐趣,在上机过程中中犯的一些错误还会有意外的收获,感觉写算法还是很有意思的。 在具体操作中对这学期所学的数据结构和以前学的C语言的理论知识得到巩固,也发现自己的不足之处,在以后的上机中应更加注意,通过实际操作,学会数据结构书中程序的编写方法和基本步骤,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 报告