比较插入排序与合并排序的运行时间
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HUST华中科技大学
数据结构与算法分析实验一·实验报告
姓名:XXXX
学号:XXXX
班级:XXXX
XXXXXXXXXX 数据结构实验报告·实验一XXXXXXXXXXXX
实验一比较插入排序与合并排序的运行时间
一、实验描述
随机生成n个数,分别用插入排序算法与合并排序算法进行排序,测试m次,计算两种算法的平均运行时间,并进行比较。
二、实验设计
算法一:插入排序
1.从第一个元素开始,该元素可以认为已经被排序
2.取出下一个元素,在已经排序的元素序列中从后向前扫描
3.如果该元素(已排序)大于新元素,将该元素移到下一位置
4.重复步骤3,直到找到已排序的元素小于或等于新元素的位置
5.将新元素插入到下一位置中
6.重复步骤2
算法二:合并排序
合并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。合并排序也叫归并排序。
XXXXXXXXXX 数据结构实验报告·实验一XXXXXXXXXXXX
三、实验实现过程
1.定义clock_t变量start 和finish,用于记录函数执行前后的时间。
2.定义函数:
a) void Insert_Sort(int a[],int n)\\插入排序
b) void Merge_Sort(int a[],const int p,const int r)\\合并排序
3.输入m=1000,输入n(每次不同),重复计算1000次,输出结果。
4.在2过程执行前后分别加入代码:
start = clock();
finish = clock();
执行时间即为:
(double)(finish - start) / CLOCKS_PER_SEC;
5.得到数据,建立坐标图。
四、实验结果
插入排序:在输入规模较大时,算法耗时相对较长;适用于对少量元素进行排序。
合并排序:相比插入算法其耗时随着规模的增加增长的慢了许多,其优势要在数据规模较大时才能体现。
XXXXXXXXXX 数据结构实验报告·实验一XXXXXXXXXXXX
代码:
#include
#include
#include
#include
void Insert_Sort(int a[],int n)
{
int i,j,k;
for(j=1;j { k=a[j]; i=j-1; while(k0) { a[i+1] = a[i]; i--; } a[i+1]=k; } } //合并排序算法中的实现合并的子程序 void Merge(int a[],const int p,const int q,const int r) { int L_Length,R_Length; int *L, *R, i, j, k; L_Length = q - p + 1; R_Length = r - q; XXXXXXXXXX 数据结构实验报告·实验一XXXXXXXXXXXX L = (int *)malloc(L_Length*sizeof(int)); R = (int *)malloc(R_Length*sizeof(int)); if(L == 0 || R== 0) { printf("内存分配失败!!!"); return; } for(i=0; i { L[i] = a[p+i]; } for(j=0; j { R[j] = a[q+j+1]; } i = 0; j = 0; for(k=p; k<=r; k++) { if((i { a[k] = L[i]; i++; } else { a[k] = R[j]; j++; } } XXXXXXXXXX 数据结构实验报告·实验一XXXXXXXXXXXX free(R);free(L); } //合并排序算法-主程序 //n*lg(n),系数较小 void Merge_Sort(int a[],const int p,const int r) { int q; if(p { q = (p+r)/2; Merge_Sort(a,p,q); Merge_Sort(a,q+1,r); Merge(a,p,q,r); } } void main() { double cost11,cost1=0,cost21,cost2=0; clock_t start, finish; int n,m,i; int *string1, *string2; printf("输入:要排序的数字个数,测试次数\n"); scanf ("%d,%d",&n,&m); for(i=1;i<=m;i++) { srand( (unsigned)time( NULL ) ); string1 = (int *)malloc(n*sizeof(int)); string2 = (int *)malloc(n*sizeof(int)); for( i = 0; i < n;i++ ) XXXXXXXXXX 数据结构实验报告·实验一XXXXXXXXXXXX