计算机算法基础实验报告

合集下载

计算机算法分析实验报告

计算机算法分析实验报告

实验一实验名称:二分制法的快速排序实验时间: 2012年12月6日成绩:一、实验目的:利用分治策略的快速排序算法,对一组数按照从小到大的方式进行排序,此算法在C++语言上的实现。

二、实验内容:快速排序法的基本思想为分治法,通过一次分割,将无序序列分为两部分,其中,前一部分的元素值均小于后一部分的元素值。

然后每一部分再各自递归进行上述过程,直到每一部分的长度为1为止。

我们知道排序的计算量通常是与序列长度的平方成正比,所以分治法将序列一分为二,再各自排序,将大大降低计算量,所以快速排序是一种高效的排序方法。

三、实验过程#include<iostream.h>int part(int s[],int p,int r) //把大于s[p]的数放一边,小于它的数放一边{int x = s[p];int i = p+1;int j = r;while(true){while(s[i] < x && i<=r) i++;while(s[j] > x && j>=1) j--;if(i >=j)break;int temp = s[i];s[i] = s[j];s[j] = temp;}s[p] = s[j];s[j] = x;return j;}void quicksort(int s[],int p,int r) {if(p < r){int q = part(s,p,r);quicksort(s, p,q-1);quicksort(s,q+1,r);}}int main(){int s[] = {4,65,12,43,67,5,78,10,3,70}; int p = 0;int r= sizeof s/sizeof *s -1;cout<<"排序前: "<<endl;for(int i=0;i<=r;i++)cout<<s[i]<<" ";cout<<endl;quicksort(s,p,r);cout<<"排序后: "<<endl;for(i=0;i<=r;i++)cout<<s[i]<<" ";cout<<endl;}四、实验结果(总结/方案) 程序运行的结果:实验二实验名称: 应用贪心算法求解背包问题 实验时间: 2012-12-6 成绩:一、实验目的:了解贪心算法的内涵,以及实现求解背包问题。

计算机基础算法实验报告

计算机基础算法实验报告

计算机基础算法实验报告班级:学号:姓名:指导教师:完成日期:实验一实现两个整数相加1.实验任务实现两个长整数相加:要求用链表(单链表或双向链表)实现任意位数的整数相加。

2.设计思想用单链表实现两个任意位整型相加,建立三个动态链表,两个分别用来存入两个加数,第三个链表用来存入和。

考虑到进位以及算术加法习惯,采用逆序插入节点,先存高位再存低位数,头指针指向最后插入的节点。

进行相加后存入第三个链表,最后将结果输出。

3.主要变量说明data 链表结点的数据域*next 链表结点的指针node单链表类型*list 单链表类型指针head 指向链表的头指针l3 指向第三个链表的头指针j 进位标志4.算法描述首先定义单链表的结构体类型,然后输入两个数,调用创建链表函数创建两个单链表将输入的数分别依次逆序存入,高位存入第一个结点,低位存入之后的结点,最后的结点存个位,并不断循环始终使头指针指向新插入的结点。

然后调用相加函数,并动态创建第三个链表将结果仍逆序存入第三个链表中。

最后调用输出函数将结果输出。

5.程序结构List creat()操作结果:构造一个动态链表list add(list l1,list l2)初始条件:链表l1,l2已存在操作结果:将两个链表的数据依次对应相加,并将结果倒叙存入链表l3void out(list l)初始条件:链表已存在操作结果:依次输出链表中的数据主函数:void main(){list l1,l2,l3;printf("请输入第一个整数,末尾输入-1表结束: ");l1=creat();out(l1);printf("请输入第二个整数,末尾输入-1表结束: ");l2=creat();out(l2);printf(”相加结果为: ”);l3=add(l1,l2);out(l3);}6.运行结果请输入第一个整数,末尾输入-1表结束:1 2 3 4 -14321请输入第二个整数,末尾输入-1表结束:7 8 9 -1987相加结果为:20237.心得体会通过本次编写程序,我对单链表有了更深的理解,由于没有使用双向链表,就采取了逆向插入结点,这使我对逆向插入有更深的理解。

算法设计与分析实验报告三篇

算法设计与分析实验报告三篇

算法设计与分析实验报告一实验名称统计数字问题评分实验日期2014 年11 月15 日指导教师姓名专业班级学号一.实验要求1、掌握算法的计算复杂性概念。

2、掌握算法渐近复杂性的数学表述。

3、掌握用C++语言描述算法的方法。

4.实现具体的编程与上机实验,验证算法的时间复杂性函数。

二.实验内容统计数字问题1、问题描述一本书的页码从自然数1 开始顺序编码直到自然数n。

书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。

例如,第6 页用数字6 表示,而不是06 或006 等。

数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2, (9)2、编程任务给定表示书的总页码的10 进制整数n (1≤n≤109) 。

编程计算书的全部页码中分别用到多少次数字0,1,2, (9)三.程序算法将页码数除以10,得到一个整数商和余数,商就代表页码数减余数外有多少个1—9作为个位数,余数代表有1—余数本身这么多个数作为剩余的个位数,此外,商还代表1—商本身这些数出现了10次,余数还代表剩余的没有计算的商的大小的数的个数。

把这些结果统计起来即可。

四.程序代码#include<iostream.h>int s[10]; //记录0~9出现的次数int a[10]; //a[i]记录n位数的规律void sum(int n,int l,int m){ if(m==1){int zero=1;for(int i=0;i<=l;i++) //去除前缀0{ s[0]-=zero;zero*=10;} }if(n<10){for(int i=0;i<=n;i++){ s[i]+=1; }return;}//位数为1位时,出现次数加1//位数大于1时的出现次数for(int t=1;t<=l;t++)//计算规律f(n)=n*10^(n-1){m=1;int i;for(i=1;i<t;i++)m=m*10;a[t]=t*m;}int zero=1;for(int i=0;i<l;i++){ zero*= 10;} //求出输入数为10的n次方int yushu=n%zero; //求出最高位以后的数int zuigao=n/zero; //求出最高位zuigaofor(i=0;i<zuigao;i++){ s[i]+=zero;} //求出0~zuigao-1位的数的出现次数for(i=0;i<10;i++){ s[i]+=zuigao*a[l];} //求出与余数位数相同的0~zuigao-1位中0~9出现的次数//如果余数是0,则程序可结束,不为0则补上所缺的0数,和最高位对应所缺的数if(yushu==0) //补上所缺的0数,并且最高位加1{ s[zuigao]++;s[0]+=l; }else{ i=0;while((zero/=10)>yushu){ i++; }s[0]+=i*(yushu+1);//补回因作模操作丢失的0s[zuigao]+=(yushu+1);//补回最高位丢失的数目sum(yushu,l-i-1,m+1);//处理余位数}}void main(){ int i,m,n,N,l;cout<<"输入数字要查询的数字:";cin>>N;cout<<'\n';n = N;for(i=0;n>=10;i++){ n/=10; } //求出N的位数n-1l=i;sum(N,l,1);for(i=0; i<10;i++){ cout<< "数字"<<i<<"出现了:"<<s[i]<<"次"<<'\n'; }}五.程序调试中的问题调试过程,页码出现报错。

算法实验报告

算法实验报告

课程实验报告课程名称:计算机算法基础专业班级:学号:姓名:指导教师:**报告日期:2016-1-2计算机科学与技术学院实验一 (1)一、实验题目 (1)二、目的与要求 (1)三、算法设计 (1)四、实验环境 (1)五、实验过程 (1)六、实验结果 (4)七、结果分析 (4)实验二 (5)一、实验题目 (5)二、目的与要求 (5)三、算法设计 (5)四、实验环境 (5)五、实验过程 (5)六、实验结果 (8)七、结果分析 (8)一、实验题目编程实现算法4.17:基于二次取中的选择算法,编制一下过程:PARTITIONINSERTIONSORT INTERCHANGE SELECT2二、目的与要求编制测试数据,给出实验结果:给出几个不同的数据集,并选择几个不同的r 值进行测试。

三、算法设计二次取中规则的选择算法的说明性描述: Procedure SELECT2(A ,k ,n) //在集合A 中找第k 小元素1 若n<=r ,则采用插入法直接对A 分类并返回第k 小元素2 把A 分成大小为r 的⎣⎦r /n 个子集合,忽略剩余的元素3 设⎣⎦}n/r ,...m m ,m ,{m 321=M 是上面⎣⎦r /n 个子集合的中间值的集合 4⎣⎦⎡⎤⎣⎦)/,2//,(2r n r n M SELECT v ←5 用PARTITION 划分A ,v 作为划分元素6 假设v 在位置j7 case:k=j :return(v):k=j :设S 是A(1:j-1)中元素的集合return(SELECT2(S ,k ,j-1)) :else :return(SELECT2(R ,k-j ,n-j)) endcase endSELECT2四、实验环境编程语言为c 语言,在windows 操作系统下运行。

五、实验过程源程序#include <stdio.h> #include <stdlib.h> #include <math.h>int r=3;int PARTITION(int p,int q,int A[]){int i,v,temp;i=p+1;q=q-1;v=A[p];while(1){for(;A[i]<v;i++) ;for(;A[q]>v;q--) ;if(i<q){temp=A[i];A[i]=A[q];A[q]=temp;}elsebreak;}A[p]=A[q];A[q]=v;return q;}void INSERTCHANGE(int *a,int *b){int t;t=*a;*a=*b;*b=t;}void INSERTIONSORT(int A[],int p,int q){int item,j,i;for(j=p+1;j<=q;j++){item=A[j];i=j-1;while((i>=p)){A[i+1]=A[i];i=i-1;}A[i+1]=item;}}int SEL(int A[],int m,int p,int k){double nrnr;int n,i,j,nr;if(p-m+1<=r){INSERTIONSORT(A,m,p);return m+k-1;}while(1){n=p-m+1;for(i=1;i<=(n/r);i++){INSERTIONSORT(A,m+(i-1)*r,m+i*r-1);INSERTCHANGE(&(A[m+i-1]),&(A[m+(i-1)*r+r/2-1]));}nrnr=(double)(n/r);nrnr=(nrnr+1.0000)/2.0000;nr=ceil(nrnr);j=SEL(A,m,m+n/r-1,nr);INSERTCHANGE(&(A[m]),&(A[j]));j=p+1;j=PARTITION(m,j,A);if(j-m+1==k)return j;elseif(j-m+1>k)p=j-1;else {k=k-(j-m+1);m=j+1;}}}int main(){int A[]={0,5,2,1,3,4,6,7,8},i,j,k,n=9;printf("测试数据为:");for(k=0;k<n;k++){printf("%d ",A[k]);}printf("\nr=%d",r);printf("\n请输入k\n");scanf("%d",&j);i=SEL(A,0,7,j);printf("第%d小元素为:",j);printf("%d\n",A[i]);printf("排序后的数据为:");for(i=0;i<=7;i++)printf("%2d",A[i]);return 0;}六、实验结果测试数组A[]={0,5,5,2,3,4,3,9,8}。

计算机算法设计实验报告

计算机算法设计实验报告

课程名:计算机算法设计与分析实验一分治法的应用——快速排序一实验目的:基于分治策略对一个序列进行快速排序。

二实验原理:分治法思想:分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。

递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。

快速排序算法是基于分治策略的另一个排序算法。

其基本思想是:对于输入的子数组A[p,r],按以下三个步骤进行排序:(1)分解:以A[p]为基准元素将A[p:r]划分成3段A[p:q-1],A[q],A[q+1:r],使得A[p:q-1]中任何一个元素小于等于A[q],A[q+1,r]中任何一个元素大于等于A[q].下标q在划分过程中确定。

(2)递归求解:通过递归调用快速排序算法分别对A[p:q-1]和A[q+1:r]进行排序。

(3)合并:对于A[p:q-1]和A[q+1:r]的排序是就地进行的,所以在A[p:q-1]和A[q+1:r]都已排好的序号不需要执行任何计算A[p:r]就已排好序。

三实验内容:实验问题:将序列{4 8 3 7 1 5 6 2}进行快速排序主要程序:void QuickSort(int A[],int p,int r){if(p<r){int q=Partition(A,p,r);QuickSort(A,p,q-1);QuickSort(A,q+1,r);}}int Partition(int A[],int p,int r){int i=p;int j=r;int x=A[p];while(i<j){while(i<j&&A[j]>=x)--j;A[i]=A[j];while(i<j&&A[i]<=x)++i;A[j]=A[i];}A[i]=x;return i;}输出结果:请输入n的值:8请输入要排序的序列:4 8 3 7 156 2排序之前的序列为:4 8 3 7 156 2排序之后的序列:1 2 3 4 5 6 7 8实验二贪心算法的应用——背包问题一实验目的:运用贪心算法解决背包问题。

算法课设实验报告(3篇)

算法课设实验报告(3篇)

第1篇一、实验背景与目的随着计算机技术的飞速发展,算法在计算机科学中扮演着至关重要的角色。

为了加深对算法设计与分析的理解,提高实际应用能力,本实验课程设计旨在通过实际操作,让学生掌握算法设计与分析的基本方法,学会运用所学知识解决实际问题。

二、实验内容与步骤本次实验共分为三个部分,分别为排序算法、贪心算法和动态规划算法的设计与实现。

1. 排序算法(1)实验目的:熟悉常见的排序算法,理解其原理,比较其优缺点,并实现至少三种排序算法。

(2)实验内容:- 实现冒泡排序、快速排序和归并排序三种算法。

- 对每种算法进行时间复杂度和空间复杂度的分析。

- 编写测试程序,对算法进行性能测试,比较不同算法的优劣。

(3)实验步骤:- 分析冒泡排序、快速排序和归并排序的原理。

- 编写三种排序算法的代码。

- 分析代码的时间复杂度和空间复杂度。

- 编写测试程序,生成随机测试数据,测试三种算法的性能。

- 比较三种算法的运行时间和内存占用。

2. 贪心算法(1)实验目的:理解贪心算法的基本思想,掌握贪心算法的解题步骤,并实现一个贪心算法问题。

(2)实验内容:- 实现一个贪心算法问题,如活动选择问题。

- 分析贪心算法的正确性,并证明其最优性。

(3)实验步骤:- 分析活动选择问题的贪心策略。

- 编写贪心算法的代码。

- 分析贪心算法的正确性,并证明其最优性。

- 编写测试程序,验证贪心算法的正确性。

3. 动态规划算法(1)实验目的:理解动态规划算法的基本思想,掌握动态规划算法的解题步骤,并实现一个动态规划算法问题。

(2)实验内容:- 实现一个动态规划算法问题,如背包问题。

- 分析动态规划算法的正确性,并证明其最优性。

(3)实验步骤:- 分析背包问题的动态规划策略。

- 编写动态规划算法的代码。

- 分析动态规划算法的正确性,并证明其最优性。

- 编写测试程序,验证动态规划算法的正确性。

三、实验结果与分析1. 排序算法实验结果:- 冒泡排序:时间复杂度O(n^2),空间复杂度O(1)。

计算机算法基础实验报告

计算机算法基础实验报告

课程实验报告题目:计算机算法基础课程实验课程名称:计算机算法基础专业班级:计算机科学与技术班学号:姓名:指导教师:报告日期:2012年11月5日计算机科学与技术学院题目1、比较快速分类算法和归并分类算法时间效率一、方案设计本实验要求比较快速分类算法和归并分类算法的效率,于是我们很容易联想到通过对比两种算法在处理相同数据所使用的时间来比较两种算法的时间效率。

因此先定义一个函数random()来生成设定个数个随机数,并以文件形式输出。

快速分类算法和归并分类算法均使用文件形式读入数据并以文件形式输出分类结果,中间过程没有人工参与,这就保证了程序运行时间基本和分类时间一致,因此算法所用时间根据调试窗口所给出程序运行时间为准。

试验中快速分类算法和归并分类算法分别在不同的工程文件中实现,对于不同个数的数据分次测试。

为了使两种算法更具有可比性,两种算法都使用递归方法实现。

已知快速分类算法和归并分类算法的平均情况时间都是0( nl og n),但是最坏情况下快速分类算法算法时间复杂度为0(n2),而归并分类算法的时间下界为Q (nlogn),因此在比较了两种算法在一般情况下的时间效率之后还要比较两种算法在最坏情况下的时间效率。

快速分类算法的最坏情况为被分类数据有序。

二、方案实现随机数据生成:#include <stdio.h>#include <stdlib.h>#include <time.h>#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<MAX; i++){a[i] = rand()%40000; //生成小于40000 的随机数for(i=0; i<MAX; i++)fprintf(fp, "%d ", a[i]); //将数据写入文件fclose(fp);return 0;}快速分类算法:#include <stdio.h>#include <stdlib.h>#define MAX 40000 //分类数据个数,根据不同要求改变int Partition(int *R,int i,int j){in t pivot=R[i]; 〃R[i]是划分元素while(i<j){while(i<j&&R[j]>=pivot) //j 由右向左移j--;if(i<j)R[i++]=R[j];while(i<j&&R[i]<=pivot) //i 由左向右移i++;if(i<j)R[j--]=R[i];}R[i]=pivot;return i; //返回划分元素的最终位置}void QuickSort(int *R,int low,int high){int pivotpos;if(low<high){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<MAX; i++)fprintf(fp, "%d ", a[i]); //排序后数据写入文件fclose(fp);return 0;}归并分类算法:#include <stdio.h>#include <stdlib.h>#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]; //部分归并后将小的数放进新的数组}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(i nt low,i nt high)// 归并排序{int mid; if(low<high){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<MAX; i++) fscanf(fp, "%d ", &A[i]); MERGESORT(0, MAX-1);h++; //查找中点位置//前部分排序 // 后部分排序//从文件中读入数据//归并分类排序fclose(fp);fp = fope n("result.txt","wt");for(i=0; i<MAX; i++)fprin tf(fp, "%d ", A[i]); 〃结果写入文件fclose(fp);return 0;}三、结果分析实验测试数据为小于40000的整形随机数,一般情况下数据是无序排列的,实验中分使用个数为40000,50000,60000,70000,80000,160000,32000(的不同数据测试算法运行时间,得到结果如下:(时间单位:ms)、\^分类算法数据个数、Quicksort MergeSort40000 94 12550000 109 15660000 125 17270000 141 20380000 156 234160000 297 625320000 578 1430算法运行时间图:快速排序和归并排序时间比较最坏情况下测试结果:(时间单位:ms)数据个数—♦—QuicksortOOOOOOOOW矶16141210S6C400200由测试结果可以看出,在一般情况下快速分类算法时间效率要优于归并分类算法,尤其是当数据量变大时归并分类算法花费时间有较大增长,而快速分类算法基本呈线性增长。

计算机基础实验报告(范本)

计算机基础实验报告(范本)

计算机‎基础实‎验报告‎计算‎机基础‎实验报‎告‎‎‎‎篇一‎:‎‎‎计算机‎基础实‎验报告‎‎(1)‎X X ‎实验‎报‎告课‎程名称‎计算‎机导论‎项目‎名称‎操作系‎统与工‎具软件‎学‎院专‎业‎无指‎导教师‎报‎告人‎学号‎实验‎时间‎提交时‎间‎一、‎实验目‎的与要‎求‎ 1‎.掌握‎i nd‎s或L‎i nu‎x的基‎本操作‎;‎ 2‎.掌握‎文件管‎理、磁‎盘管理‎以及控‎制面板‎设置;‎‎3.‎熟悉汉‎字输入‎法以及‎金山打‎字软件‎的使用‎;‎ 4‎.了解‎i nd‎s注册‎表管理‎和常用‎工具软‎件的使‎用;‎‎5.学‎会自己‎提出问‎题,并‎得出解‎决问题‎的方法‎。

实‎验内容‎与方法‎‎1.‎了解i‎n ds‎的启动‎和关闭‎,桌面‎的组成‎,窗口‎的组成‎和操作‎,鼠标‎及其操‎作,菜‎单与对‎话框,‎应用程‎序的切‎换,任‎务栏和‎?开始‎?菜单‎。

‎ 2‎.了解‎?资源‎管理器‎?和?‎我的电‎脑?,‎懂得文‎件和文‎件夹的‎操作,‎会磁盘‎清理,‎格式化‎磁盘,‎会备份‎和系统‎还原以‎及虚拟‎内存的‎设置和‎控制面‎板的鼠‎标设置‎、系统‎日期和‎时间、‎桌面背‎景及屏‎幕保护‎的设置‎、会安‎装与卸‎载应用‎程序、‎多用户‎环境的‎设置、‎文件夹‎共享的‎设置、‎汉字输‎入法的‎设置。

‎‎3.‎了解安‎装汉字‎输入法‎,添加‎或删除‎汉字输‎入法,‎输入法‎的选择‎,输入‎法的快‎捷键设‎置以及‎智能A‎B C输‎入法的‎使用和‎了解金‎山打字‎软件的‎启动及‎其窗口‎,打字‎教程,‎英文打‎字,拼‎音打字‎,速度‎测试,‎个人管‎理。

‎‎4.‎了解注‎册表基‎本结构‎,使用‎注册表‎,备份‎与还原‎注册表‎信息和‎会使用‎压缩软‎件、A‎d be‎Ac‎r ba‎t、虚‎拟光驱‎。

电子‎图书浏‎览与制‎作工具‎。

‎三‎、实验‎步骤与‎过程‎一.‎ 1‎.in‎d s的‎启动与‎关闭‎⑴in‎d s的‎启动‎连接计‎算机的‎电源,‎打开电‎源,安‎装了i‎n ds‎的计算‎机就会‎自动启‎动,计‎算机将‎显示欢‎迎的界‎面,之‎后将看‎到in‎d s的‎桌面。

算法的应用实验报告

算法的应用实验报告

一、实验目的1. 理解算法的基本概念和应用领域。

2. 掌握常用算法的设计与实现方法。

3. 通过实验,提高算法分析和解决实际问题的能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.73. 开发工具:PyCharm三、实验内容本次实验主要涉及以下算法:1. 冒泡排序2. 快速排序3. 二分查找4. 线性查找四、实验步骤1. 冒泡排序(1)实现冒泡排序算法的Python代码:```pythondef bubble_sort(arr):n = len(arr)for i in range(n):for j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]return arr# 测试冒泡排序算法arr = [64, 34, 25, 12, 22, 11, 90]print("Original array:", arr)sorted_arr = bubble_sort(arr)print("Sorted array:", sorted_arr)```(2)分析冒泡排序算法的时间复杂度:O(n^2)2. 快速排序(1)实现快速排序算法的Python代码:```pythondef quick_sort(arr):if len(arr) <= 1:return arrpivot = arr[len(arr) // 2]left = [x for x in arr if x < pivot]middle = [x for x in arr if x == pivot]right = [x for x in arr if x > pivot]return quick_sort(left) + middle + quick_sort(right) # 测试快速排序算法arr = [64, 34, 25, 12, 22, 11, 90]print("Original array:", arr)sorted_arr = quick_sort(arr)print("Sorted array:", sorted_arr)```(2)分析快速排序算法的时间复杂度:O(nlogn) 3. 二分查找(1)实现二分查找算法的Python代码:```pythondef binary_search(arr, x):low = 0high = len(arr) - 1while low <= high:mid = (low + high) // 2if arr[mid] < x:low = mid + 1elif arr[mid] > x:high = mid - 1else:return midreturn -1# 测试二分查找算法arr = [1, 3, 5, 7, 9, 11, 13, 15]print("Original array:", arr)x = 7result = binary_search(arr, x)if result != -1:print(f"Element {x} is present at index {result}") else:print(f"Element {x} is not present in array")```(2)分析二分查找算法的时间复杂度:O(logn)4. 线性查找(1)实现线性查找算法的Python代码:```pythondef linear_search(arr, x):for i in range(len(arr)):if arr[i] == x:return ireturn -1# 测试线性查找算法arr = [1, 3, 5, 7, 9, 11, 13, 15]print("Original array:", arr)x = 7result = linear_search(arr, x)if result != -1:print(f"Element {x} is present at index {result}") else:print(f"Element {x} is not present in array")```(2)分析线性查找算法的时间复杂度:O(n)五、实验总结通过本次实验,我们学习了冒泡排序、快速排序、二分查找和线性查找等常用算法的设计与实现方法。

常见算法设计实验报告(3篇)

常见算法设计实验报告(3篇)

第1篇一、实验目的通过本次实验,掌握常见算法的设计原理、实现方法以及性能分析。

通过实际编程,加深对算法的理解,提高编程能力,并学会运用算法解决实际问题。

二、实验内容本次实验选择了以下常见算法进行设计和实现:1. 排序算法:冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序。

2. 查找算法:顺序查找、二分查找。

3. 图算法:深度优先搜索(DFS)、广度优先搜索(BFS)、最小生成树(Prim算法、Kruskal算法)。

4. 动态规划算法:0-1背包问题。

三、实验原理1. 排序算法:排序算法的主要目的是将一组数据按照一定的顺序排列。

常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序等。

2. 查找算法:查找算法用于在数据集中查找特定的元素。

常见的查找算法包括顺序查找和二分查找。

3. 图算法:图算法用于处理图结构的数据。

常见的图算法包括深度优先搜索(DFS)、广度优先搜索(BFS)、最小生成树(Prim算法、Kruskal算法)等。

4. 动态规划算法:动态规划算法是一种将复杂问题分解为子问题,通过求解子问题来求解原问题的算法。

常见的动态规划算法包括0-1背包问题。

四、实验过程1. 排序算法(1)冒泡排序:通过比较相邻元素,如果顺序错误则交换,重复此过程,直到没有需要交换的元素。

(2)选择排序:每次从剩余元素中选取最小(或最大)的元素,放到已排序序列的末尾。

(3)插入排序:将未排序的数据插入到已排序序列中适当的位置。

(4)快速排序:选择一个枢纽元素,将序列分为两部分,使左侧不大于枢纽,右侧不小于枢纽,然后递归地对两部分进行快速排序。

(5)归并排序:将序列分为两半,分别对两半进行归并排序,然后将排序好的两半合并。

(6)堆排序:将序列构建成最大堆,然后重复取出堆顶元素,并调整剩余元素,使剩余元素仍满足最大堆的性质。

2. 查找算法(1)顺序查找:从序列的第一个元素开始,依次比较,直到找到目标元素或遍历完整个序列。

基本算法操作实验报告

基本算法操作实验报告

一、实验目的1. 熟悉基本算法操作,包括排序、查找等。

2. 掌握常用算法的原理和实现方法。

3. 培养编程实践能力,提高算法设计水平。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.73. 开发工具:PyCharm三、实验内容1. 排序算法2. 查找算法3. 算法分析四、实验步骤1. 排序算法(1)选择插入排序算法进行实现。

(2)编写代码,实现插入排序算法。

(3)编写测试用例,验证插入排序算法的正确性。

2. 查找算法(1)选择二分查找算法进行实现。

(2)编写代码,实现二分查找算法。

(3)编写测试用例,验证二分查找算法的正确性。

3. 算法分析(1)分析插入排序算法的时间复杂度和空间复杂度。

(2)分析二分查找算法的时间复杂度和空间复杂度。

五、实验结果与分析1. 排序算法(1)插入排序算法实现如下:```pythondef insertion_sort(arr):for i in range(1, len(arr)):key = arr[i]j = i - 1while j >= 0 and key < arr[j]:arr[j + 1] = arr[j]j -= 1arr[j + 1] = keyreturn arr```(2)测试用例:```pythontest_arr = [5, 2, 9, 1, 5, 6]sorted_arr = insertion_sort(test_arr)print("Sorted array:", sorted_arr)```输出结果:```Sorted array: [1, 2, 5, 5, 6, 9]```2. 查找算法(1)二分查找算法实现如下:```pythondef binary_search(arr, x):low = 0high = len(arr) - 1mid = 0while low <= high:mid = (high + low) // 2if arr[mid] < x:low = mid + 1elif arr[mid] > x:high = mid - 1else:return midreturn -1```(2)测试用例:```pythontest_arr = [1, 2, 3, 4, 5, 6, 7, 8, 9] x = 5result = binary_search(test_arr, x)if result != -1:print("Element is present at index", result)else:print("Element is not present in array")```输出结果:```Element is present at index 4```3. 算法分析(1)插入排序算法的时间复杂度为O(n^2),空间复杂度为O(1)。

关于算法的实验报告(3篇)

关于算法的实验报告(3篇)

第1篇一、实验目的1. 理解快速排序算法的基本原理和实现方法。

2. 掌握快速排序算法的时间复杂度和空间复杂度分析。

3. 通过实验验证快速排序算法的效率。

4. 提高编程能力和算法设计能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019三、实验原理快速排序算法是一种分而治之的排序算法,其基本思想是:选取一个基准元素,将待排序序列分为两个子序列,其中一个子序列的所有元素均小于基准元素,另一个子序列的所有元素均大于基准元素,然后递归地对这两个子序列进行快速排序。

快速排序算法的时间复杂度主要取决于基准元素的选取和划分过程。

在平均情况下,快速排序的时间复杂度为O(nlogn),但在最坏情况下,时间复杂度会退化到O(n^2)。

四、实验内容1. 快速排序算法的代码实现2. 快速排序算法的时间复杂度分析3. 快速排序算法的效率验证五、实验步骤1. 设计快速排序算法的C++代码实现,包括以下功能:- 选取基准元素- 划分序列- 递归排序2. 编写主函数,用于生成随机数组和测试快速排序算法。

3. 分析快速排序算法的时间复杂度。

4. 对不同规模的数据集进行测试,验证快速排序算法的效率。

六、实验结果与分析1. 快速排序算法的代码实现```cppinclude <iostream>include <vector>include <cstdlib>include <ctime>using namespace std;// 生成随机数组void generateRandomArray(vector<int>& arr, int n) {srand((unsigned)time(0));for (int i = 0; i < n; ++i) {arr.push_back(rand() % 1000);}}// 快速排序void quickSort(vector<int>& arr, int left, int right) { if (left >= right) {return;}int i = left;int j = right;int pivot = arr[(left + right) / 2]; // 选取中间元素作为基准 while (i <= j) {while (arr[i] < pivot) {i++;}while (arr[j] > pivot) {j--;}if (i <= j) {swap(arr[i], arr[j]);i++;j--;}}quickSort(arr, left, j);quickSort(arr, i, right);}int main() {int n = 10000; // 测试数据规模vector<int> arr;generateRandomArray(arr, n);clock_t start = clock();quickSort(arr, 0, n - 1);clock_t end = clock();cout << "排序用时:" << double(end - start) / CLOCKS_PER_SEC << "秒" << endl;return 0;}```2. 快速排序算法的时间复杂度分析根据实验结果,快速排序算法在平均情况下的时间复杂度为O(nlogn),在最坏情况下的时间复杂度为O(n^2)。

计算机算法实验报告BF和KMP

计算机算法实验报告BF和KMP

天津市大学软件学院实验报告课程名称:串匹配算法实验姓名:***学号:**********班级:业务1114串匹配问题一、实验题目:给定一个主串,在该主串中查找并定位任意给定字符串。

二、实验目的:(1)深刻理解并掌握蛮力法的设计思想;(2)提高应用蛮力法设计算法的技能;(3)理解这样一个观点:用蛮力法设计的算法,一般来说,经过适度的努力后,都可以对算法的第一个版本进行一定程度的改良,改进其时间性能。

三、实验分析:串匹配问题的BF算法1 在串S中和串T中设比较的下标i=1和j=1;2 循环直到S中所剩字符个数小于T的长度或T中所有字符均比较完2.1 k=i2.2 如果S[i]=T[j],则比较S和T的下一字符,否则2.2 将i和j回溯(i=k+1; j=1)3 如果T中所有字符均比较完,则匹配成功,返回k否则匹配失败,返回0时间复杂度:设匹配成功发生在si处,则在i-1趟不成功的匹配中比较了(i-1)m次,第i趟成功匹配共比较了m次,所以总共比较了i m次,因此平均比较次数是:pi(i m)=(i m)=一般情况下,m<<n,因此最坏情况下时间复杂度是Ο(n m)。

串匹配问题的KMP算法实现过程:在串S和串T中高比较的起始下标i和j;循环直到S中所剩字符小于T的长度或T的所有字符均比较完(如果S[i]=T[j],则继续比较S和T的下一个字符;否则将j向右滑动到next[j]位置,即j=next[j];如果j=0,则将i和j分别+1,准备下趟比较,至于其中的next在此不作详细讲解);如果T中所有字符均比较完,则匹配成功,返回匹配的起始下标;否则匹配失败,返回0。

时间复杂度:Ο(n m),当m<<n时,KMP算法的时间复杂性是Ο(n)。

四、实验所用语言和运行环境C++,运行环境Microsoft Visual C++ 6.0五、实验过程的原始记录BF算法程序代码#include<iostream.h>#include<string>void main(){cout<<"请输入主串并且以0和回车结束"<<endl;char s[100];char t[100];for(int m=0;m<100;m++){cin>>s[m];if(s[m]=='0'){s[m]='\0';break;}}cout<<"您输入的主串为:";for(int o=0;o<strlen(s);++o){cout<<s[o];}cout<<endl;cout<<"主串长度:";cout<<strlen(s);cout<<endl<<endl;cout<<"请输入子串并且以0和回车结束"<<endl;for(int n=0;n<100;n++){cin>>t[n];if(t[n]=='0'){t[n]='\0';break;}}cout<<"您输入的子串为:";for(int a=0;a<strlen(t);++a){cout<<t[a];}cout<<endl;cout<<"子串长度:";cout<<strlen(t);cout<<endl;cout<<endl<<"++++++++BF算法++++++++"<<endl;int i,j,k,y=0;for(i=0;i<strlen(s)-strlen(t)+1;){k=i;for(j=0;j<strlen(t);)if(s[i]==t[j]){if(j==strlen(t)-1){cout<<"找到了相同的字串:";cout<<"位置在主串的第"<<i-j+1<<"的位置上";cout<<endl;y=1;break;}++i;++j;}else{j=0;break;}}i=k+1;if(y==1)break;}if(i==strlen(s)-strlen(t)+1&&j!=strlen(t)-1){cout<<"没有找到可以匹配的子串"<<endl;}}程序执行结果:查找到了子串没有查找到子串程序代码#include<iostream.h>#include<string>//前缀函数值,用于KMP算法int GETNEXT(char t[],int b){int NEXT[10];NEXT[0]=-1;int j,k;j=0;k=-1;while(j<strlen(t)){if ((k==-1)||(t[j]==t[k])){j++;k++;NEXT[j]=k;}else k=NEXT[k];}b=NEXT[b];return b;}int KMP(char s[],char t[]){int a=0;int b=0;int m,n;m=strlen(s); //主串长度n=strlen(t); //子串长度cout<<endl<<"+++++++++KMP算法++++++++++++"<<endl;while(a<=m-n){while(s[a]==t[b]&&b!=n){a++;b++;}if(b==n){cout<<"找到了相应的子串位置在主串:"<<a-b+1<<endl;return 0;}b=GETNEXT(t,b);a=a-b;if(b==-1) b++;}cout<<"没有找到匹配的子串!"<<endl;return 0;}void main(){cout<<"请输入主串并且以0和回车结束"<<endl;char s[100];char t[100];for(int m=0;m<100;m++){cin>>s[m];if(s[m]=='0'){s[m]='\0';break;}}cout<<"您输入的主串为:";for(int o=0;o<strlen(s);++o){cout<<s[o];}cout<<endl;cout<<"主串长度:";cout<<strlen(s);cout<<endl<<endl;cout<<"请输入子串并且以0和回车结束"<<endl;for(int n=0;n<100;n++){cin>>t[n];if(t[n]=='0'){t[n]='\0';break;}}cout<<"您输入的子串为:";for(int a=0;a<strlen(t);++a){cout<<t[a];}cout<<endl;cout<<"子串长度:";cout<<strlen(t);cout<<endl;KMP(s,t);}程序执行结果:查找到子串没有查到子串。

算法基础实验报告

算法基础实验报告

一、实验目的本次实验旨在帮助学生掌握算法的基本概念、设计方法和分析方法,通过实际操作加深对算法原理的理解,提高编程能力和问题解决能力。

二、实验内容1. 实验一:排序算法(1)实验目的:掌握常见的排序算法,如冒泡排序、选择排序、插入排序、快速排序等,并分析其时间复杂度和空间复杂度。

(2)实验内容:① 冒泡排序:通过相邻元素的比较和交换,将待排序序列变为有序序列。

② 选择排序:每次从待排序序列中选出最小(或最大)的元素,将其放到序列的起始位置。

③ 插入排序:将无序序列的元素逐个插入到已排序序列的合适位置。

④ 快速排序:通过一趟排序将待排序序列分为独立的两部分,其中一部分的所有元素均比另一部分的所有元素小。

(3)实验步骤:① 编写每个排序算法的代码;② 编写测试代码,验证排序算法的正确性;③ 分析每个排序算法的时间复杂度和空间复杂度。

2. 实验二:查找算法(1)实验目的:掌握常见的查找算法,如顺序查找、二分查找等,并分析其时间复杂度和空间复杂度。

(2)实验内容:① 顺序查找:从序列的起始位置逐个比较,找到待查找元素。

② 二分查找:对于有序序列,每次将待查找元素与序列中间的元素比较,缩小查找范围。

(3)实验步骤:① 编写每个查找算法的代码;② 编写测试代码,验证查找算法的正确性;③ 分析每个查找算法的时间复杂度和空间复杂度。

3. 实验三:图算法(1)实验目的:掌握常见的图算法,如深度优先搜索(DFS)、广度优先搜索(BFS)等,并分析其时间复杂度和空间复杂度。

(2)实验内容:① 深度优先搜索:从给定顶点开始,探索所有相邻顶点,直至所有可达顶点都被访问。

② 广度优先搜索:从给定顶点开始,按照顶点之间的距离顺序访问相邻顶点。

(3)实验步骤:① 编写每个图算法的代码;② 编写测试代码,验证图算法的正确性;③ 分析每个图算法的时间复杂度和空间复杂度。

三、实验结果与分析1. 实验一:排序算法(1)冒泡排序、选择排序、插入排序的时间复杂度均为O(n^2),空间复杂度均为O(1)。

算法实验报告(完美版)

算法实验报告(完美版)

实验报告实验一:一、实验名称二分搜索法二、实验目的编写程序实现用二分法在一有序序列中查找一个数三、实验内容1、程序源代码#include<stdio.h>int Research(int a[],int x,int n){int left=0,right=n-1,mid;if(n>0&&x>=a[0]){while(left<right){mid=(left+right+1)/2;if(x<a[mid])right=mid-1;elseleft=mid;}if(x==a[left])return left;}return -1;}void Input(){int a[30],n,i,j,x;printf("输入数组长度n :");scanf("%d",&n);printf("输入有序数组: \n\n");for(i=0;i<n;i++){printf("a[%d]:",i);scanf("%d",&a[i]);}printf("输入要查询的数字:");scanf("%d",&x);j=Research(a,x,n);if(j>=0)printf("%d 在数组中的下标为%d!\n\n",x,j);elseprintf("没找到!\n\n");}main(){Input();}运行结果图一图二实验心得: 本次实验让我了解了二分搜索法的基本思想, 同时我们应该注意二分搜索法必须是在有序的元素中进行, 不能在无序的元素中使用。

快速排序:#include<iostream>using namespace std;#define MAXSIZE 100int Partition(int q[MAXSIZE],int low,int hight);void Qsort(int q[],int low,int hight);int main(){int q[MAXSIZE]; //存储数列的数组q[0]=0;int n=0;cout<<"请输入需要排序的数的个数: ";cin>>n;cout<<"\n请输入需要排序的数: \n";for(int i=1;i<=n;i++) //用循环方式输入数列{cin>>q[i];}Qsort(q,1,n); //调用Partition()函数cout<<"\n排序后结果为: \n";for(i=1;i<=n;i++) //循环输出结果{cout<<q[i]<<" ";}cout<<endl;return 0;}int Partition(int q[MAXSIZE],int low,int high) //对数列及数列部分划分成高低两个部分{int pivotkey; //用于标记q[low]这个关键数q[0]=q[low]; //q[0]用于存储q[low]这个数, q[low]空出pivotkey=q[low];while(low<high) //判断长度是否大于1{while(low<high && q[high]>=pivotkey)high--;q[low]=q[high]; //当pivotkey的值大于q[high], 将q[high]放入q[low]中, q[high]空出while(low<high && q[low]<=pivotkey)low++;q[high]=q[low]; //当pivotkey的值小于q[low], 将q[low]放入q[high]中, q[low]空出}q[low]=q[0]; //将q[0]中存储的数放入它合适的位置return low;}void Qsort(int q[MAXSIZE],int low,int high){int pivotkey; //记录关键数上一次排序后的位子if(low<high){pivotkey=Partition(q,low,high);Qsort(q,low,pivotkey-1); //对比关键数小的数(左侧)排序Qsort(q,pivotkey+1,high); //对比关键数大的数(右侧)排序}}运行结果:实验总结: 在实验过程中, 我只考虑了对数进行排序, 没有其他的指针, 所以就直接用了int型的数组。

算法实验报告

算法实验报告
printf("\nMemory full!\n"); getchar(); exit(-1); }
size=MAX; n=0; printf("\nPlease input the Max weight(0 or negative numbers to exit)\n");
- 10 -
计算机算法实验报告
fflush(stdin); getchar(); } }
-7-
0/1 背包问题:
计算机算法实验报告
一 实验内容描述和功能分析
内容描述
已知有 N 种物品,和一个可以容纳 M 重量的背包,每种第 i 号的物品重量为 wi,假定物品 的每一部分 Xi 放入背包就会得到 Pi*Xi 的效益,这里 Xi=0 or 1,Pi>=0。要求出一种算法使 装入背包之物品的效益值达到最大值。
计算机算法实验报告
<<计算机算法基础>>实验报告
姓名: 学号: 专业: 班级:
报告日1-
计算机算法实验报告
目录
N 皇后问题
一、实验内容描述和功能分析 二、算法过程设计 三、程序调试及结果(附截图) 四、源代码(附源程序)
0/1 背包问题
一、实验内容描述和功能分析 二、算法过程设计 三、程序调试及结果(附截图) 四、源代码(附源程序)
if(!pp&&!ww) goto A;
while(pp!=0&&ww!=0) //当输入的都是 0 时,进行中断操作 {
p[n]=pp;w[n]=ww; n++; printf("Please input the price of %d bag\n",n+1); scanf("%f",&pp); printf("Please input the weight of %d bag\n",n+1); scanf("%f",&ww);

计算机算法实验报告

计算机算法实验报告

实验一最接近点对问题一、实验目的为进一步学习分治策略的基本思想,本次实验将通过求最接近点对问题来加深我们对分治策略的认识。

二、实验问题描述给定平面上N个点,找出其中的一对点,使得在n 个点组成的所有点对中,该点对间的距离最小。

三、设计思路及步骤将所给平面上n个点的集合S分成两个子集S1和S2,每个子集中约有n/2个点。

然后在每个子集中递归地求其最接近的点对。

先考虑一维的情形:设计一个求一维点集S的最接近点对的算法Bool Cpairl(S,d){N=|S|; if(n<2) {d=无穷大;return falSe;} m=S中各点坐标的中位数;构造S1和S2; //S1={x∈S|x<=m},S2={x∈S|x>m}Cpairl(S1,d1); Cpairl(S2,d2); p=max(S1); q=max(S2);D=min(d1,d2,q-p);return true;}由此推广到二维的情形:若矩形R中有多于6个S中的点,则由鸽舍原理易知,至少有一个(d/2)*(2d/3)的小矩形中有2个以上S中的点。

设u,v是位于同一小矩形中的2个点,则(x(u)-x(v))²+(y(u)-y(v))²<=(d/2)²+(2d/3)²=25d²/36因此distance(u,v)<=5d/6<d,与d的意义相矛盾。

四、算法实现代码//2d10-2 二维最邻近点对问题#include<time.h>#include<iostream>#include<cmath>using namespace std;const int M=50;//用类PointX和PointY表示依x坐标和y坐标排好序的点class PointX {public:int operator<=(PointX a)const{ return (x<=a.x); }int ID; //点编号float x,y; //点坐标};class PointY {public:int operator<=(PointY a)const{ return(y<=a.y); }int p; //同一点在数组x中的坐标float x,y; //点坐标};float Random();template <class Type>float dis(const Type&u,const Type&v);bool Cpair2(PointX X[], int n,PointX& a,PointX& b, float& d);void closest(PointX X[],PointY Y[],PointY Z[], int l, int r,PointX& a,PointX& b,float& d);template <typename Type>void Copy(Type a[],Type b[], int left,int right);template <class Type>void Merge(Type c[],Type d[],int l,int m,int r);template <class Type>void MergeSort(Type a[],Type b[],int left,int right);int main(){srand((unsigned)time(NULL));int length;cout<<"请输入点对数:";cin>>length;PointX X[M];cout<<"随机生成的二维点对为:"<<endl;for(int i=0;i<length;i++){X[i].ID=i;X[i].x=Random();X[i].y=Random();cout<<"("<<X[i].x<<","<<X[i].y<<") ";}PointX a,b;float d;Cpair2(X,length,a,b,d);cout<<endl;cout<<"最邻近点对为:("<<a.x<<","<<a.y<<")和("<<b.x<<","<<b.y<<") "<<endl;cout<<"最邻近距离为: "<<d<<endl;return 0;}float Random(){float result=rand()%10000;return result*0.01;}//平面上任意两点u和v之间的距离可计算如下template <class Type>inline float dis(const Type& u,const Type& v){float dx=u.x-v.x;float dy=u.y-v.y;return sqrt(dx*dx+dy*dy);}bool Cpair2(PointX X[], int n,PointX& a,PointX& b,float& d){if(n<2) return false;PointX* tmpX = new PointX[n];MergeSort(X,tmpX,0,n-1);PointY* Y=new PointY[n];for(int i=0;i<n;i++) //将数组X中的点复制到数组Y中{Y[i].p=i;Y[i].x=X[i].x;Y[i].y=X[i].y;}PointY* tmpY = new PointY[n];MergeSort(Y,tmpY,0,n-1);PointY* Z=new PointY[n];closest(X,Y,Z,0,n-1,a,b,d);delete []Y;delete []Z;delete []tmpX;delete []tmpY;return true;}void closest(PointX X[],PointY Y[],PointY Z[], int l, int r,PointX& a,PointX& b,float& d){if(r-l==1) //两点的情形{a=X[l];b=X[r];d=dis(X[l],X[r]);return;}if(r-l==2) //3点的情形{float d1=dis(X[l],X[l+1]);float d2=dis(X[l+1],X[r]);float d3=dis(X[l],X[r]);if(d1<=d2 && d1<=d3){a=X[l];b=X[l+1];d=d1;return;}if(d2<=d3){a=X[l+1];b=X[r];d=d2;}else {a=X[l];b=X[r];d=d3;}return;}//多于3点的情形,用分治法int m=(l+r)/2;int f=l,g=m+1;//在算法预处理阶段,将数组X中的点依x坐标排序,将数组Y中的点依y坐标排序//算法分割阶段,将子数组X[l:r]均匀划分成两个不想交的子集,取m=(l+r)/2//X[l:m]和X[m+1:r]就是满足要求的分割。

算法设计基础实验报告

算法设计基础实验报告

算法设计基础实验班级:学号:姓名:实验一线性表的应用1.实验内容:1.给定一线性表L=(15,25,05,36,78,85,23),写出顺序存储结构下的插入、删除、排序操作的算法及程序。

2.写出链接存储结构下的插入、删除、排序操作的算法及程序。

2.实验要求:1.掌握顺序及链接存储下的插入、删除算法;2.掌握直接插入排序算法;3.实验程序#include<iostream.h>#include<stdlib.h>struct List{int *list;int size;int MaxSize;};void InitList(List &L){L.MaxSize=10;L.list=new int[L.MaxSize];if(L.list==NULL){cout<<"动态可分配的存储空间用完,退出运行!"<<endl;exit(1);}L.size=0;}bool InsertList(List &L,int item,int pos){if(pos<-1||pos>L.size+1){cout<<"pos值无效!"<<endl;return false;}int i;if(pos==0){for(i=0;i<L.size;i++)if(item<L.list[i]) break;pos=i+1;}else if(pos==-1)pos=L.size+1;if(L.size==L.MaxSize){int k=sizeof(int);L.list=(int*)realloc(L.list,2*L.MaxSize*k);if(L.list==NULL){cout<<"动态可分配的空间用完,退出运行!"<<endl;exit(1);}L.MaxSize=2*L.MaxSize;}for(i=L.size-1;i>=pos-1;i--)L.list[i+1]=L.list[i];L.list[pos-1]=item;L.size++;return true;}bool DeleteList(List &L,int &item,int pos){if(L.size==0){cout<<"线性表为空,删除无效!"<<endl;return false;}if(pos<-1||pos>L.size){cout<<"pos值无效!"<<endl;return false;}int i;if(pos==0){for(i=0;i<L.size;i++)if(item==L.list[i])break;if(i==L.size)return false;pos=i+1;}else if(pos==-1)pos=L.size;item=L.list[pos-1];for(i=pos;i<L.size;i++)L.list[i-1]=L.list[i];L.size--;if(float(L.size)/L.MaxSize<0.4&&L.MaxSize>10) {int k=sizeof(int);L.list=(int*)realloc(L.list,L.MaxSize*k/2);L.MaxSize=L.MaxSize/2;}return true;}void SortList(List &L){int i,j;int x;for(i=1;i<L.size;i++){x=L.list[i];for(j=i-1;j>=0;j--)if(x<L.list[j])L.list[j+1]=L.list[j];else break;L.list[j+1]=x;}}void TraverseList(List &L){for(int i=0;i<L.size;i++)cout<<L.list[i]<<' ';cout<<endl;}void main(){int a[7]={15,25,5,36,78,85,23};int i;int x;List t;InitList(t);for(i=0;i<7;i++)InsertList(t,a[i],i+1);SortList(t);TraverseList(t);cout<<"输入待删除元素的值:";cin>>x;if(DeleteList(t,x,0))cout<<"删除成功!"<<endl;else cout<<"删除失败!"<<endl;TraverseList(t);cout<<"按值插入,输入待插入元素的值:"<<endl; cin>>x;if(InsertList(t,x,0))cout<<"插入成功!"<<endl;else cout<<"插入失败!"<<endl;TraverseList(t);}4.实验结果:实验二二叉树的遍历1.实验内容:给定一棵用广义表表示的二叉树T,写出其前序遍历、中序遍历、后序遍历、层序遍历的算法及程序。

基础算法实验报告总结

基础算法实验报告总结

一、实验背景与目的随着计算机科学的发展,算法作为其核心内容之一,日益受到重视。

为了提高对基础算法的理解和掌握,本实验通过对几种常见基础算法的学习和实践,旨在加深对算法原理的理解,提高算法设计能力。

二、实验内容与过程本次实验主要涉及以下几种基础算法:1. 快速排序算法快速排序是一种常用的排序算法,其基本思想是分治法。

通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

实验过程中,我们实现了快速排序算法,并针对不同规模的数据进行了测试,验证了算法的效率和稳定性。

2. 二分查找算法二分查找算法是一种在有序数组中查找特定元素的算法。

其基本思想是将待查找的元素与数组的中间元素进行比较,根据比较结果,将查找范围缩小一半,直至找到目标元素或查找范围为空。

实验中,我们实现了二分查找算法,并通过实例演示了其在不同情况下的查找过程,验证了算法的正确性和效率。

3. 动态规划算法动态规划是一种通过将问题分解为子问题,并存储子问题的解以避免重复计算的方法。

实验中,我们以斐波那契数列为例,实现了动态规划算法,并分析了其时间复杂度和空间复杂度。

4. 回溯法回溯法是一种通过尝试所有可能的解,并逐步排除不满足条件的解,从而找到问题解的方法。

实验中,我们以八皇后问题为例,实现了回溯法,并分析了算法的搜索过程和效率。

三、实验结果与分析1. 快速排序算法实验结果表明,快速排序算法在处理大规模数据时,具有较好的效率。

其平均时间复杂度为O(nlogn),在最坏情况下为O(n^2)。

通过优化选择基准元素的方法,可以提高算法的稳定性。

2. 二分查找算法二分查找算法在有序数组中具有很高的效率,平均时间复杂度为O(logn)。

在处理大规模数据时,二分查找算法的性能明显优于顺序查找算法。

3. 动态规划算法动态规划算法在解决某些问题时具有明显的优势,尤其是在具有重叠子问题的情况下。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程实验报告题目:计算机算法基础课程实验课程名称:计算机算法基础专业班级:计算机科学与技术班学号:姓名:指导教师:报告日期:2012年11月5日计算机科学与技术学院题目1、比较快速分类算法和归并分类算法时间效率一、方案设计本实验要求比较快速分类算法和归并分类算法的效率,于是我们很容易联想到通过对比两种算法在处理相同数据所使用的时间来比较两种算法的时间效率。

因此先定义一个函数random()来生成设定个数个随机数,并以文件形式输出。

快速分类算法和归并分类算法均使用文件形式读入数据并以文件形式输出分类结果,中间过程没有人工参与,这就保证了程序运行时间基本和分类时间一致,因此算法所用时间根据调试窗口所给出程序运行时间为准。

试验中快速分类算法和归并分类算法分别在不同的工程文件中实现,对于不同个数的数据分次测试。

为了使两种算法更具有可比性,两种算法都使用递归方法实现。

已知快速分类算法和归并分类算法的平均情况时间都是O(nlogn),但是最坏情况下快速分类算法算法时间复杂度为O(n2),而归并分类算法的时间下界为Ω(nlogn),因此在比较了两种算法在一般情况下的时间效率之后还要比较两种算法在最坏情况下的时间效率。

快速分类算法的最坏情况为被分类数据有序。

二、方案实现随机数据生成:#include <stdio.h>#include <stdlib.h>#include <time.h>#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<MAX; i++){a[i] = rand()%40000; //生成小于40000的随机数}for(i=0; i<MAX; i++)fprintf(fp, "%d ", a[i]); //将数据写入文件fclose(fp);return 0;}快速分类算法:#include <stdio.h>#include <stdlib.h>#define MAX 40000 //分类数据个数,根据不同要求改变int Partition(int *R,int i,int j){int pivot=R[i]; //R[i]是划分元素while(i<j){while(i<j&&R[j]>=pivot) //j由右向左移j--;if(i<j)R[i++]=R[j];while(i<j&&R[i]<=pivot) //i由左向右移i++;if(i<j)R[j--]=R[i];}R[i]=pivot;return i; //返回划分元素的最终位置}void QuickSort(int *R,int low,int high){int pivotpos;if(low<high){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<MAX; i++)fprintf(fp, "%d ", a[i]); //排序后数据写入文件fclose(fp);return 0;}归并分类算法:#include <stdio.h>#include <stdlib.h>#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<high){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<MAX; i++)fscanf(fp, "%d ", &A[i]); //从文件中读入数据MERGESORT(0, MAX-1); //归并分类排序fclose(fp);fp = fopen("result.txt","wt");for(i=0; i<MAX; i++)fprintf(fp, "%d ", A[i]); //结果写入文件fclose(fp);return 0;}三、结果分析实验测试数据为小于40000的整形随机数,一般情况下数据是无序排列的,实验中分使用个数为40000,50000,60000,70000,80000,160000,320000的不同数据测试算法运行时间,得到结果如下:(时间单位:ms)算法运行时间图:最坏情况下测试结果:(时间单位:ms)由测试结果可以看出,在一般情况下快速分类算法时间效率要优于归并分类算法,尤其是当数据量变大时归并分类算法花费时间有较大增长,而快速分类算法基本呈线性增长。

在最坏请况下快速分类算法优势不再,花费时间很多,而归并分类算法花费时间与一般情况下基本持平,可见归并分类算法与数据的顺序与否没有关系,这也说明了归并分类算法算法是最坏情况下的最优解。

题目2、修改算法SHORTEST-PATHS,使得它在获取最短路径的同时还得到这些路径。

一、方案设计图的信息存放在文件中,通过文件读入图的信息。

文件中信息存储格式为:第一个整数表示顶点数,第二个整数表示边个数,下面每三个整数为一组,表示单条边的信息,每组中第一个数为该条边的起点,第二个数为终点,第三个数是边的权值。

设定全局变量n表示结点个数,数组s存放已被选中的结点,数组dist[i]是从v0开始只经s中的结点而在i结束的那条最短路径的长度。

二维数组a记录的是成本邻接矩阵,pre记录最短路径到i的前一个顶点,用于最后最短路径的输出。

在主函数中首先进行成本邻接矩阵的初始化,由输入得到结点个数和有向图的边边的权值,接下来输入一个起始节点v,再通过dijkstra算法找到最短路径生成树并将最短路径信息保存在pre中,最后输出各条最短路径。

dijkstra函数第一个for循环先将从源点到i的最短路径设为从源点到i的权值,集合s初始化为空,从源点到i有通路时最短路径前一个节点设为源点。

第二个for循环中嵌套的第一个for循环选取结点u使得dist[u]=min{dist[w]},第二个嵌套循环将所有s[w]=0的结点修改距离使得dist[w]=min{dist[w],dist[w]+a[u][w]}。

二、方案实现#include <stdio.h>#include <stdlib.h>#define N 10#define INFINITY 32767 //无穷大int number=0; //节点数int A[N][N]; //记录边的权值int dist[N]; //v0开始只经s中的结点而在i结束的那条最短路径的长度int pre[N]; //最短路径到i的前一个顶点int s[N+1]; //已被选中的结点int path[N+1]; //路径void Init(){FILE *fp;int i,j,w,n;memset(A, 0, sizeof(A));fp = fopen("relation.txt", "rt");fscanf(fp, "%d\n", &number); //从文件中读入节点数fscanf(fp, "%d\n", &n); //从文件中读入边条数for(; n>0; n--){fscanf(fp, "%d %d %d\n", &i,&j,&w); //读入边信息A[i][j] = w; //图的信息存入成本邻接矩阵}for(i=1; i<=number; i++)for(j=1; j<=number; j++){if(A[i][j]==0)A[i][j] = INFINITY; //不可到达的边权值为无穷大if(i == j)A[i][j] = 0; //矩阵对角线为0}fclose(fp);}void dijkstra(int qidian){int i,j,u,temp;long newdist; //当前路径长度if(qidian<1 || qidian>number)return;for(i=1;i<=number;i++) //初始设置{dist[i]=A[qidian][i];//初始时从源点到i的最短路径设为从源点到i的权值s[i]=1;if(dist[i]==INFINITY)pre[i]=0; //从源点到i没有通路elsepre[i]=qidian;//从源点到i有通路时,最短路径前一个结点设为源点}dist[qidian]=0; //源点到源点的最短路径为0s[qidian]=0;for(i=1;i<number;i++) //中心部分{temp=INFINITY;u=qidian;//找出一个剩余结点中到源点最短的结点for(j=1;j<=number;j++)//如果该点不是源点并且源点到j点路径是最短if((s[j]==1) && (dist[j]<temp)){u=j; //u记录最短路径的点temp=dist[j]; //记录源点到j点的最短路径}s[u]=0; //u点是下面进行比较的点for(j=1;j<=number;j++) //找出通过U点是否有更短的路径//源点到u的路径+u到j的路径小于源点到j的路径if((s[j]==1) && (A[u][j]<INFINITY)){newdist=dist[u]+A[u][j];if(newdist<dist[j]){dist[j]=newdist; //更改源点到j的路径长度pre[j]=u;//更改源点到j的最短路径中,j的前一个结点}}}}int main(){int qidian,i,j,n;printf("输入起点:");scanf("%d",&qidian);Init(); //初始化成本临界矩阵dijkstra(qidian);memset(path, 0, sizeof(path));for(i=1;i<=number;i++) //得到以起点为源点的每条最短路径并输出{if(i!=qidian && dist[i]<INFINITY){printf("\n从结点%d 到%d,最短路径长%d:\n",qidian,i,dist[i]);j=i;n=0;do{j=pre[j];path[n++]=j;} while(j!=qidian); //将逆序输出的点存入path数组n--;while(n>=0)printf("%d,",path[n--]); //顺序输出路径printf("%d",i);}}return 0;}三、结果分析程序运行结果:(有向图参照的是课本图5.10),图信息为7121 2 20 1 3 50 1 4 40 2 3 25 2 6 70 3 4 403 5 25 3 6 5045 55 56 10 57 70 6 7 501、起点选为1结点2、起点选为5可见程序得到了正确结果,在dijkstra函数中有两个for循环,第一个for循环时间复杂度为O(n),第二个for循环时间复杂度为O(n2)。

相关文档
最新文档