计算机算法基础实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程实验报告题目:计算机算法基础课程实验
课程名称:计算机算法基础
专业班级:计算机科学与技术班
学号:
姓名:
指导教师:
报告日期:2012年11月5日
计算机科学与技术学院
题目1、比较快速分类算法和归并分类算法时间效率
一、方案设计
本实验要求比较快速分类算法和归并分类算法的效率,于是我们很容易联想到通过对比两种算法在处理相同数据所使用的时间来比较两种算法的时间效率。
因此先定义一个函数random()来生成设定个数个随机数,并以文件形式输出。
快速分类算法和归并分类算法均使用文件形式读入数据并以文件形式输出
分类结果,中间过程没有人工参与,这就保证了程序运行时间基本和分类时间一致,因此算法所用时间根据调试窗口所给出程序运行时间为准。试验中快速分类算法和归并分类算法分别在不同的工程文件中实现,对于不同个数的数据分次测试。
为了使两种算法更具有可比性,两种算法都使用递归方法实现。
已知快速分类算法和归并分类算法的平均情况时间都是O(nlogn),但是最坏情况下快速分类算法算法时间复杂度为O(n2),而归并分类算法的时间下界为
Ω(nlogn),因此在比较了两种算法在一般情况下的时间效率之后还要比较两种算法在最坏情况下的时间效率。快速分类算法的最坏情况为被分类数据有序。二、方案实现
随机数据生成:
#include
#include
#include
#define MAX 40000 //生成数据个数,根据不同要求改变
int main()
{
int a[MAX]; //整形数组a[MAX]存放生成的随机数
long i;
memset(a,0,sizeof(a));
FILE *fp;
fp = fopen("example.txt","wt");
srand((int)time(0));
for(i=0; i { a[i] = rand()%40000; //生成小于40000的随机数 } for(i=0; i fprintf(fp, "%d ", a[i]); //将数据写入文件fclose(fp); return 0; } 快速分类算法: #include #include #define MAX 40000 //分类数据个数,根据不同要求改变int Partition(int *R,int i,int j) { int pivot=R[i]; //R[i]是划分元素 while(i { while(i j--; if(i R[i++]=R[j]; while(i i++; if(i R[j--]=R[i]; } R[i]=pivot; return i; //返回划分元素的最终位置 } void QuickSort(int *R,int low,int high) { int pivotpos; if(low { pivotpos=Partition(R,low,high); QuickSort(R,low,pivotpos-1); QuickSort(R,pivotpos+1,high); } } int main() { FILE *fp; int a[MAX],i,n; fp = fopen("example.txt","rt"); for(i=0; i<40000; i++) fscanf(fp, "%d ", &a[i]); //从文件中读入数据QuickSort(a, 0, MAX-1); //快速分类 fclose(fp); fp = fopen("result.txt","wt"); for(i=0; i fprintf(fp, "%d ", a[i]); //排序后数据写入文件fclose(fp); return 0; } 归并分类算法: #include #include #define MAX 40000 //分类数据个数,根据不同要求改变 int A[MAX]; void MERGE(int low,int mid,int high) //归并组合 { int h,k,i,j; int B[MAX]; //组合比较后形成新的数组 h=low; i=0; j=mid+1; //对h,i,j分别初始化 while(h<=mid&&j<=high) { if(A[h]<=A[j]) { B[i]=A[h]; //部分归并后将小的数放进新的数组 h++; } else { B[i]=A[j]; j++; } i++; } while(h<=mid) B[i++]=A[h++]; //转存剩余元素 while(j<=high) B[i++]=A[j++]; for(i=0,k=low;i<=high-low;i++,k++) A[k]=B[i]; //将B数组中的所有元素还回到A数组中} void MERGESORT(int low,int high)//归并排序 { int mid; if(low { mid=(high+low)/2; //查找中点位置 MERGESORT(low,mid); //前部分排序 MERGESORT(mid+1,high); //后部分排序 MERGE(low,mid,high); } } int main() { FILE *fp; int i,n; fp = fopen("example.txt","rt"); for(i=0; i fscanf(fp, "%d ", &A[i]); //从文件中读入数据MERGESORT(0, MAX-1); //归并分类排序