当前位置:文档之家› 算法分析——实验一

算法分析——实验一

算法分析实验报告
实验一分治策略排序
实验目的
1)以排序问题为例,掌握分治法的基本设计策略;
2)熟练掌握合并排序算法的实现;
3)熟练掌握快速排序算法的实现;
4) 理解常见的算法经验分析方法。

实验环境
计算机、C语言程序设计环境、VC++6.0
实验步骤
算法的基本描述:
1、合并排序的基本思想描述:首先将序列分为两部分,分到每组只有两个元
素,然后对每一部分进行循环递归地合并排序,然后逐个将结果进行合并。

2、快速排序的基本思想描述:将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,最后达到排序效果。

要求:编写一个函数data-generate,生成2000个在区间[1,10000]上的随机整数,并将这些数输出到外部文件data.txt中。

这些数作为本算法实验的输入数据。

程序流程图:
合并排序原理图
快速排序流程图1.生成2000个随机整数的程序:#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
FILE *fpt;
fpt = fopen("D://data.txt","w");
srand(time(0));
for(int i=0;i<2000;i++)
fprintf(fpt,"%3d\t",rand()%10000+1);
return 0;
fclose(fpt);
}
并生成data.txt文件。

2.读取data.txt文件,并排序。

实现合并排序算法输入:待排数据文件data.txt;
输出:有序数据文件resultsMS.txt
合并排序算法:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void mergesort(int a[],int n);
void merge(int a[],int b[],int i,int c[],int j);
{
int a[2000];
int i=0,j;
FILE *fpt;
fpt=fopen("D:\\data.txt","r");
if((fpt=fopen("D:\\data.txt","r"))==NULL) {
printf("\n error!");
exit(0);
}
while (fscanf(fpt,"%d",&a[i])!=EOF)
i++;
mergesort(a,2000);
fpt = fopen("D://resultMS.txt","w");
srand(time(0));
for(j=0;j<2000;j++)
{
printf("%d ",a[j]);
fprintf(fpt,"%3d\t",a[j]);
}
fclose(fpt);
return 0;
}
void mergesort(int a[],int n){
if(n<=1)
return;
int i,j;
int *b;
int *c;
b=(int *)malloc(sizeof(int)*(n/2));
c=(int *)malloc(sizeof(int)*(n-n/2));
for(i=0;i<n/2;i++){
b[i]=a[i];
}
for(j=0;j<n-n/2;j++){
c[j]=a[j+n/2];
}
mergesort(b,(n/2));
mergesort(c,(n-n/2));
merge(a,b,(n/2),c,(n-n/2));
}
void merge(int a[],int b[],int x,int c[],int y) {
int j=0;
int k=0;
while((i<x)&&(j<y)){
if(b[i]<=c[j]){
a[k]=b[i];
i++;
}
else{
a[k]=c[j];
j++;
}
k++;
}
int l;
if(i==x){
for(l=j;l<y;l++){
a[k]=c[l];
k++;
}
}
else{
for(l=i;l<x;l++){
a[k]=b[l];
k++;
}
}
}
运行结果为:
resultMS.txt内的数即为随机生成的数的排序。

3.实现QuickSort算法。

输入:待排数据文件data.txt;
输出:有序数据文件resultsQS.txt
程序:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int partions(int l[],int low,int high)
{
int prvotkey=l[low];
l[0]=l[low];
while (low<high){
while (low<high&&l[high]>=prvotkey)
--high;
l[low]=l[high];
while (low<high&&l[low]<=prvotkey)
++low;
l[high]=l[low];
}
l[low]=l[0];
return low;
}
void qsort(int l[],int low,int high){
int prvotloc;if(low<high){
prvotloc=partions(l,low,high); //第排序结作枢轴
qsort(l,low,prvotloc-1); //递归调用排序由low prvotloc-1
qsort(l,prvotloc+1,high); //递归调用排序由prvotloc+1 high }
}
void quicksort(int l[],int n){
qsort(l,1,n); //第作枢轴第排第n
}
void main(){
int a[2000];
int i=0;
FILE *fpt;
fpt=fopen("D:\\data.txt","r");
if((fpt=fopen("D:\\data.txt","r"))==NULL)
{
printf("\n error");
exit(0);
}
while (fscanf(fpt,"%d",&a[i])!=EOF)
i++;
quicksort(a,2000);
fpt=fopen("D:\\resultsQS.txt","w");
srand(time(0));
for(int j=1;j<2000;j++){
printf("%3d\t",a[j]);
fprintf(fpt,"%3d\t",a[j]);
}
fclose(fpt);
}
运行的结果:
生成resultsQS文件
程序运行的时间:
TimeMS的运行时间为0.0000ms
TimeQS的运行时间为:
产生的原因:
可能是计算机运行速度太快,两者运行时间没有太大的差距,所以程序运行的时间约为0.
实验分析:
从理论上看,快速排序最好情形的时间复杂度为O(NlogN),最坏的情形为O(N*N),平均时间复杂度O(NlogN)。

归并排序最好情形的时间复杂度为O(NlogN),最坏的情形为O(NlogN),平均时间复杂度O(NlogN)。

因此,可以看出,快速排序算法较之合并排序而言更有优势,尽管保持在相同的数量级下,但面对越大基数的无序数列时,快速排序的用时更短。

心得体会:
从本次的实验可以体会到完成一个完美的算法实验是不容易的,最重要的是要保持一颗积极向上的心,面对比较困难的问题要想办法去解决。

通过本次实验使得我的编程能力得到提升。

从会简单的小程序变为实现比较大的算法题。

相关主题