实验3 内部排序算法比较
- 格式:doc
- 大小:98.00 KB
- 文档页数:9
数据结构实验报告实验3 存储管理查找和排序题目:内部排序算法比较09927104 陈驰一.需求分析1.本演示对一下6种常见的内部排序算法进行测试比较:起泡排序,直接插入排序,简单选择排序,快速排序,堆排序,二路归并排序2.待排序表的有元素的关键字为整数。
用随机数的数据比较各算法的关键字比较次数和关键字的移动次数。
3.演示程序以用户和计算机的对话方式执行,即在计算机终端机上显示“提示信息”,用户可由键盘输入待排序表的长度。
每次测试完毕,列表显示各种比较指标值。
二.概要设计为实现上述操作,应以结构数组作为存储结构。
基本操作:suiji()操作结果:在输入你想要排序的个数之后,随机生成,并保存在结构数组中,接着进行各个排序2.本程序包含三个模块:(1)主程序模块(主要用来输出排序后的结果);(2)各个可排序单元模块;(3)用来实行控制排序的jiuji()函数模块。
三.详细设计1.元素类型:typedef struct{int key;}datatype;2.每个模块的分析:(1)主函数模块int main(){printf("----------------------\n");suiji();printf(" 比较结果\n");printf(" 排序方式比较次数移动次数\n");printf(" 直接%d %d \n",cn[0],mn[0]);printf(" 简单选择%d %d \n",cn[1],mn[1]);printf(" 冒泡%d %d \n",cn[2],mn[2]);printf(" 推排序%d %d \n",cn[3],mn[3]);printf(" 二路归并%d %d \n",cn[4],mn[4]);printf(" 快速排序%d %d \n",cn[5],mn[5]);return 0;}(2)控制各个排序方法的模块void suiji(){long i,n;datatype R[MAXNUM]={0};////定义结构数组printf("请输入你要输入d个数\n");scanf("%d",&n);if(n>500000){printf("超出范围重新输入\n");scanf("%d ",&n);}for(i=1;i<=n;i++)R[i].key=rand()%1000;printf("排序前的元素顺序\n");for(i=1;i<n+1;i++){printf("%d ",R[i].key);}printf("\n");D_InsertSort(R,n);//直接排序Select_Sort(R,n);//简单选择排序Bubble_Sort(R,n);//冒泡排序HeapSort(R,n); //推排序datatype R2[MAXNUM]={0};MergeSort(R,R2,n);Quick_Sort(R,0,n);//快速排序prin(R,n);}(3)完整代码#include <stdio.h>#include <time.h>#include <stdlib.h>#define MAXNUM 10000long cn[MAXNUM],mn[MAXNUM];typedef struct{int key;}datatype;void D_InsertSort(datatype R[],long n)//直接排序{long i ,j;for(i=2;i<=n;i++){cn[0]++;if(R[i].key<R[i-1].key){R[0]=R[i];mn[0]++;for(j=i-1;R[0].key<R[j].key;j--)R[j+1]=R[j];R[j+1]=R[0];mn[0]+=2;}}}void Select_Sort(datatype R[],long n)//简单选择排序{long i,j,k;for(i=1;i<n;i++){k=i;for(j=i+1;j<=n;j++){cn[1]++;if(R[j].key<R[k].key)k=j;}if(i=k){R[0]=R[k];R[k]=R[i];R[i]=R[0];mn[1]+=3;}}}void Bubble_Sort(datatype R[],long n)//冒泡排序{long i,j;for(i=1;i<n-1;i++){for(j=1;j<=n-i;j++){cn[2]++;if(R[j].key<R[j+1].key){R[0]=R[j];R[j]=R[j+1];R[j+1]=R[0];mn[2]+=3;}}}}void HeapAdjust(datatype R[], long s, long t)//堆调整{datatype rc;long i,j;rc=R[s];i=s;for(j=2*i;j<=t;j=2*j){cn[3]++;if(j<t&&R[j].key<R[j+1].key)j=j+1;if(rc.key>R[j].key)break;R[i]=R[j];mn[3]++;i=j;}R[i]=rc;}void HeapSort(datatype R[], long n)//推排序{long i;for(i=n/2;i>0;i--)HeapAdjust(R,i,n);for(i=n;i>1;i--){R[0]=R[1];R[1]=R[i];R[i]=R[0];mn[3]+=3;HeapAdjust(R,1,i-1);}}void Merge(datatype R[],datatype R1[], long s, long m, long t) {long i ,j ,k;i=s;j=m+1;k=s;while(i<=m&&j<=t){cn[4]++;if(R[i].key<R[j].key){R1[k++]=R[i++];mn[4]++;}else{R1[k++]=R[j++];mn[4]++;}}while(i<=m){R1[k++]=R[i++];mn[4]++;}while(j<=t){R1[k++]=R[j++];mn[4]++;}}void MSort(datatype R[],datatype R1[], long s,long t){long m;if(s==t){R1[s]=R[s];mn[4]++;}else{m=(s+t)/2;MSort(R,R1,s,m);MSort(R,R1,m+1,t);Merge(R1,R,s,m,t);}}void MergeSort(datatype R[],datatype R1[],long n)//归并排序{MSort(R,R1,1,n);long Partition(datatype R[], long low, long high){R[0]=R[low];mn[5]++;while(low<high){while(low<high&&R[high].key>=R[0].key){cn[5]++;high--;}if(low<high){R[low]=R[high];low++;mn[5]++;}while(low<high&&R[low].key<R[0].key){cn[5]++;low++;}if(low<high){R[high]=R[low];high--;mn[5]++;}}R[low]=R[0];mn[5]++;return low;}void Quick_Sort(datatype R[],long s, long t)//快速排序{long i;if(s<t){i=Partition(R,s,t);Quick_Sort(R,s,i-1);Quick_Sort(R,i+1,t);}}void prin(datatype R[], long n)long i;printf("排序结果为:\n");for(i=1;i<=n;i++){printf("%d ",R[i]);}printf("\n");}void suiji(){long i,n;datatype R[MAXNUM]={0};////定义结构数组printf("请输入你要输入d个数\n");scanf("%d",&n);if(n>500000){printf("超出范围重新输入\n");scanf("%d ",&n);}for(i=1;i<=n;i++)R[i].key=rand()%1000;printf("排序前的元素顺序\n");for(i=1;i<n+1;i++){printf("%d ",R[i].key);}printf("\n");D_InsertSort(R,n);//直接排序Select_Sort(R,n);//简单选择排序Bubble_Sort(R,n);//冒泡排序HeapSort(R,n); //推排序datatype R2[MAXNUM]={0};MergeSort(R,R2,n);Quick_Sort(R,0,n);//快速排序prin(R,n);}int main(){printf("----------------------\n");suiji();printf(" 比较结果\n");printf(" 排序方式比较次数移动次数\n");printf(" 直接%d %d \n",cn[0],mn[0]);printf(" 简单选择%d %d \n",cn[1],mn[1]);printf(" 冒泡%d %d \n",cn[2],mn[2]);printf(" 推排序%d %d \n",cn[3],mn[3]);printf(" 二路归并%d %d \n",cn[4],mn[4]);printf(" 快速排序%d %d \n",cn[5],mn[5]);return 0;}四.调试结果及说明1.说明(1)本程序的运行环境为C-Free5(2)进入演示程序后即显示提示信息:请输入你要输入d个数2.测试结果(1)输入4(2)输入8。