中科大软院算法实验一报告

合集下载

算法实验报告结果分析

算法实验报告结果分析

一、实验背景随着计算机科学技术的不断发展,算法作为计算机科学的核心内容之一,其重要性日益凸显。

为了验证和评估不同算法的性能,我们进行了一系列算法实验,通过对比分析实验结果,以期为后续算法研究和优化提供参考。

二、实验方法本次实验选取了三种常见的算法:快速排序、归并排序和插入排序,分别对随机生成的数据集进行排序操作。

实验数据集的大小分为10000、20000、30000、40000和50000五个级别,以验证算法在不同数据量下的性能表现。

实验过程中,我们使用Python编程语言实现三种算法,并记录每种算法的运行时间。

同时,为了确保实验结果的准确性,我们对每种算法进行了多次运行,并取平均值作为最终结果。

三、实验结果1. 快速排序快速排序是一种高效的排序算法,其平均时间复杂度为O(nlogn)。

从实验结果来看,快速排序在所有数据量级别下均表现出较好的性能。

在数据量较小的10000和20000级别,快速排序的运行时间分别为0.05秒和0.1秒;而在数据量较大的40000和50000级别,运行时间分别为0.8秒和1.2秒。

总体来看,快速排序在各个数据量级别下的运行时间均保持在较低水平。

2. 归并排序归并排序是一种稳定的排序算法,其时间复杂度也为O(nlogn)。

实验结果显示,归并排序在数据量较小的10000和20000级别下的运行时间分别为0.15秒和0.25秒,而在数据量较大的40000和50000级别,运行时间分别为1.5秒和2.5秒。

与快速排序相比,归并排序在数据量较小的情况下性能稍逊一筹,但在数据量较大时,其运行时间仍然保持在较低水平。

3. 插入排序插入排序是一种简单易实现的排序算法,但其时间复杂度为O(n^2)。

实验结果显示,插入排序在数据量较小的10000和20000级别下的运行时间分别为0.3秒和0.6秒,而在数据量较大的40000和50000级别,运行时间分别为8秒和15秒。

可以看出,随着数据量的增加,插入排序的性能明显下降。

软件算法展示实验报告(3篇)

软件算法展示实验报告(3篇)

第1篇一、实验目的1. 理解并掌握软件算法的基本概念和原理。

2. 掌握常见软件算法的设计与实现方法。

3. 通过实验,提高算法分析、设计、实现和优化能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm三、实验内容本次实验主要展示了以下软件算法:1. 冒泡排序2. 快速排序3. 二分查找4. 线性查找5. 简单链表操作6. 二叉树遍历四、实验步骤1. 冒泡排序(1)编写冒泡排序算法的代码实现。

(2)测试代码,验证算法的正确性。

2. 快速排序(1)编写快速排序算法的代码实现。

(2)测试代码,验证算法的正确性。

3. 二分查找(1)编写二分查找算法的代码实现。

(2)测试代码,验证算法的正确性。

4. 线性查找(1)编写线性查找算法的代码实现。

(2)测试代码,验证算法的正确性。

5. 简单链表操作(1)实现链表的创建、插入、删除和遍历等基本操作。

(2)测试代码,验证链表操作的正确性。

6. 二叉树遍历(1)实现二叉树的创建、插入、遍历等基本操作。

(2)测试代码,验证二叉树遍历的正确性。

五、实验结果与分析1. 冒泡排序实验结果:```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]测试代码arr = [64, 34, 25, 12, 22, 11, 90]bubble_sort(arr)print("Sorted array is:", arr)```分析:冒泡排序算法是一种简单的排序算法,其基本思想是通过相邻元素的比较和交换,将待排序的序列逐步变成有序序列。

实验结果显示,冒泡排序算法能正确地将输入数组排序。

算法实验报告

算法实验报告

算法实验报告算法实验报告引言:算法是计算机科学的核心内容之一,它是解决问题的方法和步骤的描述。

算法的设计和分析是计算机科学与工程中的重要研究方向之一。

本实验旨在通过对算法的实际应用和实验验证,深入理解算法的性能和效果。

实验一:排序算法的比较在本实验中,我们将比较三种常见的排序算法:冒泡排序、插入排序和快速排序。

我们将通过对不同规模的随机数组进行排序,并记录每种算法所需的时间和比较次数,以评估它们的性能。

实验结果显示,快速排序是最快的排序算法,其时间复杂度为O(nlogn),比较次数也相对较少。

插入排序的时间复杂度为O(n^2),比较次数较多,但对于小规模的数组排序效果较好。

而冒泡排序的时间复杂度也为O(n^2),但比较次数更多,效率相对较低。

实验二:图的最短路径算法在图的最短路径问题中,我们将比较Dijkstra算法和Floyd-Warshall算法的效率和准确性。

我们将使用一个带权有向图,并计算从一个顶点到其他所有顶点的最短路径。

实验结果表明,Dijkstra算法适用于单源最短路径问题,其时间复杂度为O(V^2),其中V为顶点数。

而Floyd-Warshall算法适用于多源最短路径问题,其时间复杂度为O(V^3)。

两种算法在准确性上没有明显差异,但在处理大规模图时,Floyd-Warshall算法的效率较低。

实验三:动态规划算法动态规划是一种通过将问题分解成子问题并记录子问题的解来解决复杂问题的方法。

在本实验中,我们将比较两种动态规划算法:0-1背包问题和最长公共子序列问题。

实验结果显示,0-1背包问题的动态规划算法可以有效地找到最优解,其时间复杂度为O(nW),其中n为物品个数,W为背包容量。

最长公共子序列问题的动态规划算法可以找到两个序列的最长公共子序列,其时间复杂度为O(mn),其中m和n分别为两个序列的长度。

结论:通过本次实验,我们对不同算法的性能和效果有了更深入的了解。

排序算法中,快速排序是最快且效率最高的;在图的最短路径问题中,Dijkstra算法和Floyd-Warshall算法分别适用于不同的场景;动态规划算法可以解决复杂的问题,并找到最优解。

算法设计实验报告一

算法设计实验报告一

.
a[i]=num[i]; iStart=GetTickCount(); QuickSort(a,1,MAX); iStop=GetTickCount(); runtime=iStop-iStart; printf("使用快速排序用了%ldms\n",runtime);
}
五、程序运行结果(包括上机调试的情况、调试所遇到的问题是如何解决的,并对调 试过程中的问题进行分析,对执行结果进行分析。):
A[high] = A[i+1]; A[i+1] = x; return i+1; }
void QuickSort(int A[],int low,int r) {
if(low<r) {
//快速排序
..
..
..... Nhomakorabea..
.
int high = Partition(A,low,r); QuickSort(A,low,high-1); QuickSort(A,high+1,r); } }
..
..
..
..
.
..
.
{ int i,j,k; int x; for (i=1;i<=length-1;++i) { k=i; for(j=i+1;j<=length;++j) if(r[j]<r[k]) k=j; if( k!=i) { x= r[i]; r[i]=r[k]; r[k]=x; } }
..
..
.
..
.
if(low<r) { int high = Partition(A,low,r); QuickSort(A,low,high-1); QuickSort(A,high+1,r); }

中国科技大学算法导论_第一次实验报告

中国科技大学算法导论_第一次实验报告

快速排序实验报告SA14225010一、题目当输入数据已经“几乎”有序时,插入排序速度很快。

在实际应用中,我们可以利用这一特点来提高快速排序的速度。

当对一个长度小于k的子数组调用快速排序时,让它不做任何排序就返回。

当上层的快速排序调用返回后,对整个数组运行插入排序来完成排序过程。

试证明:这一排序算法的期望时间复杂度为O (nk+nlg(n/k))。

分别从理论和实践的角度说明我们应该如何选择k?二、算法思想当输入数据已经“几乎”有序时,插入排序速度很快。

当对一个长度小于k的子数组调用快速排序时,让它不做任何排序就返回。

当上层的快速排序调用返回后,对整个数组运行插入排序来完成排序过程。

累加k的值,计算出当k为不同值时算法运行的时间,来算出当k大约为什么值时运行的时间最短,并与传统的快速排序算法的运行时间进行比较。

三、实验结果输入100个不同的整数值,选取不同的k的值,观察所用时间四、实验分析理论上看,k的值选取为20到25较好;但是,从实际上来看,当k为50左右时间为39毫秒,最少,但不同的时刻运行后的时间都不相同,而且不同的输入时刻的运行时间也不相同,当数据较大时候,对k 的值的选取有会有所不同,同时不同性能的机器对测试结果也不同,所以对于k值的选取没有固定的数值。

#include<iostream>#include<sys/timeb.h>using namespace std;#define M 40void swap(int * a,int * b){int tem;tem=*a;*a=*b;*b=tem;}int partition(int v[],const int low,const int high){int i,pivotpos,pivot;pivotpos=low;pivot=v[low];for(i=low+1;i<=high;++i){if(v[i]<pivot){pivotpos++;if(pivotpos!=i)swap(v[i],v[pivotpos]);}}v[low]=v[pivotpos];v[pivotpos]=pivot;//cout<<"the partition function is called\n";return pivotpos;}/*void QuickSort(int a[], const int low,const int high) {int item;if(low<high){item=partition(a,low,high);QuickSort(a,low,item-1);QuickSort(a,item+1,high);}}*/void QuickSort(int a[], const int low,const int high) {int item;if(high-low<=M)return;if(low<high){item=partition(a,low,high);QuickSort(a,low,item-1);QuickSort(a,item+1,high);}// cout<<"the QuickSort is called"<<endl;}void InsertSort(int a[],const int low,const int high){int i,j;int tem;for(i=1;i<high+1;++i){tem=a[i];j=i-1;while(j>=0&&tem<a[j]){a[j+1]=a[j];j--;}a[j+1]=tem;}//cout<<"the InsertSort is called"<<endl;}void HybridSort(int a[],const int low,const int high){QuickSort(a,low,high);InsertSort(a,low,high);cout<<"the HybidSort is called"<<endl;}int main(){int i,a[100];//int *a=NULL;long int t;struct timeb t1,t2;/*cout<<"please input the number of the element:"<<endl;cin>>n;a = (int*)malloc(n*sizeof(int));cout<<"please input every element:"<<endl;*/for( i=0; i<100; i++){a[i]=i+10;}//QuickSort(a,0,n-1);ftime(&t1);HybridSort(a,0,99);cout<<" after sorted quickly,the result is"<<endl;for(i=0; i<100; i++){cout<<a[i]<<" ";if(i%10==0)cout<<endl;}cout<<endl;ftime(&t2);t=(t2.time-t1.time)*1000+(litm); /* 计算时间差 */ printf("k=%d 用时%ld毫秒\n",M,t);//cout<<"the memory of array a is free"<<endl;//free(a);cout<<"\n"<<endl;return 0;}。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 编写贪心算法的代码。

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

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

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

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

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

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

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

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

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

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

算法分析实验一报告

算法分析实验一报告

《算法设计与分析》实验报告目录一、实验内容描述和功能分析.二、算法过程设计.三、程序调试及结果(附截图).四、源代码(附源代码).一、实验内容描述和功能分析.1.彼岸内容描述:突破蝙蝠的包围,yifenfei来到一处悬崖面前,悬崖彼岸就是前进的方向,好在现在的yifenfei已经学过御剑术,可御剑轻松飞过悬崖。

现在的问题是:悬崖中间飞着很多红,黄,蓝三种颜色的珠子,假设我们把悬崖看成一条长度为n的线段,线段上的每一单位长度空间都可能飞过红,黄,蓝三种珠子,而yifenfei 必定会在该空间上碰到一种颜色的珠子。

如果在连续3段单位空间碰到的珠子颜色都不一样,则yifenfei就会坠落。

比如经过长度为3的悬崖,碰到的珠子先后为“红黄蓝”,或者“蓝红黄”等类似情况就会坠落,而如果是“红黄红”或者“红黄黄”等情况则可以安全到达。

现在请问:yifenfei安然抵达彼岸的方法有多少种?输入:输入数据首先给出一个整数C,表示测试组数。

然后是C组数据,每组包含一个正整数n (n<40)。

输出:对应每组输入数据,请输出一个整数,表示yifenfei安然抵达彼岸的方法数。

每组输出占一行。

例如:输入:2 输出:92 2132.统计问题内容描述:在一无限大的二维平面中,我们做如下假设:1、每次只能移动一格;2、不能向后走(假设你的目的地是“向上”,那么你可以向左走,可以向右走,也可以向上走,但是不可以向下走);3、走过的格子立即塌陷无法再走第二次;求走n步不同的方案数(2种走法只要有一步不一样,即被认为是不同的方案)。

输入:首先给出一个正整数C,表示有C组测试数据接下来的C行,每行包含一个整数n (n<=20),表示要走n步。

输出:请编程输出走n步的不同方案总数;每组的输出占一行。

例如:输入:2 输出:31 723.Message Decowing内容描述:The cows are thrilled because they've just learned about encrypting messages. Theythink they will be able to use secret messages to plot meetings with cows on other farms.Cows are not known for their intelligence. Their encryption method is nothing like DES or BlowFish or any of those really good secret coding methods. No, they are using a simple substitution cipher.The cows have a decryption key and a secret message. Help them decode it. The key looks like this:yrwhsoujgcxqbativndfezmlpkWhich means that an 'a' in the secret message really means 'y'; a 'b' in the secret message really means 'r'; a 'c' decrypts to 'w'; and so on. Blanks are not encrypted; they are simply kept in place. Input text is in upper or lower case, both decrypt using the same decryption key, keeping the appropriate case, of course.输入:* Line 1: 26 lower case characters representing the decryption key* Line 2: As many as 80 characters that are the message to be decoded输出:* Line 1: A single line that is the decoded message. It should have the same length as the second line of input.例如:输入:eydbkmiqugjxlvtzpnwohracsfKifq oua zarxa suar bti yaagrj fa xtfgrj输出:Jump the fence when you seeing me coming二、算法过程设计.第一题是一个典型的递归问题,通过对开始的几项附初始值,通过循环利用通项公式依次递归调用公式便可以得到第n项的值。

算法 实验总结

算法 实验总结

算法实验总结算法实验是计算机科学与技术专业的重要实践环节,通过实验可以加深对算法原理的理解,提高编程能力,培养解决实际问题的能力。

本次算法实验主要涉及排序算法和图算法,以下是我对实验内容的总结。

首先,通过本次实验我学会了如何使用不同的算法对数据进行排序。

排序是计算机科学中的基本问题,不同的排序算法在时间复杂度和空间复杂度上有不同的特点,因此选择合适的排序算法对于提高程序的效率非常重要。

在实验中,我实现了冒泡排序、插入排序、选择排序、快速排序和归并排序,并测试了它们的性能。

通过对比实验结果,我了解到不同排序算法的优劣之处。

比如,冒泡排序的时间复杂度较高,而快速排序和归并排序在平均情况下具有较好的性能。

通过这些实验,我对排序算法的原理和实现有了更深入的理解。

其次,本次实验还涉及了图算法的实现和应用。

图是一种常见的数据结构,图算法在很多实际问题中有广泛的应用,比如最短路径问题和最小生成树问题。

在实验中,我实现了图的表示和遍历算法,比如深度优先搜索(DFS)和广度优先搜索(BFS)。

我还应用这些算法解决了迷宫问题和旅行商问题。

通过这些实验,我深入理解了图算法的原理和应用场景。

在实验过程中,我遇到了一些困难和问题。

比如,在实现一些排序算法时,我对循环的控制条件不熟悉,导致程序出现错误。

此外,在解决一些图问题时,我对递归的理解不够深入,导致程序运行不正常。

为了解决这些问题,我查阅了相关的教材和资料,向同学和老师请教,最终找到了解决方法。

这个过程虽然有些困难,但是我从中学到了很多,并且提高了自己的解决问题的能力。

通过本次实验,我不仅学到了一些基本的算法和数据结构知识,还提高了编程能力和解决问题的能力。

实验过程中,我学会了如何分析算法的时间复杂度和空间复杂度,以及如何根据实际问题选择合适的算法。

我还学习了编写测试用例和对程序进行调试的方法。

这些技能对我今后的学习和工作都具有重要的意义。

总之,本次算法实验让我更深入地理解了排序算法和图算法的原理和应用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
intx =A[r];
inti =p- 1;
for(intj =p; j <=r- 1; j++)
{
if(A[j] <= x) {
i j);
}
}
Exchange(A, i + 1,r);
returni + 1;
}
//在左右两个区间进行递归调用本身
voidquick_sort(intA[],intp,intr)
for(int i = 0;i < length;i++){
cout<<array[i]<<endl;
}
end = clock();
cout<<"优化排序时间为:"<< end - start<<endl;;
}
void QUICK_INSERT_SORT (int A[],int n,int k)
{
{
quick_sort(A,0,n,k);
int i=0;
int x=0;
for(int j=1;j<=n;j++)
{
x = A[j];
i = j;
while(i > 0 && A[i - 1] > x)
{
A[i] = A[i - 1];
i--;
}
A[i] = x;
}
}
三、结果与分析:
题目一:
下面是运行快速排序算法,首先生成1000个随机数组成的数组,然后对这1000个随机数进行排序,最后利用c++的时间函数对整个数组输出进行统计时间,得到的时间为743.
}
end = clock();
cout<<"时间是"<<end - start<<endl;
}
intPARTITION(intA[],intp,intr) {
intx =A[r];
inti =p- 1;
for(intj =p; j <=r- 1; j++)
{
if(A[j] <= x) {
i = i + 1;
voidquick_sort(intA[],intp,intr);
intmain()
{
//定义一个随机产生1000个数的数组
intlength = 1000;
int*array =newint[length];
for(inti = 0; i < length; i++)
{
array[i] = rand();
Exchange(A, i, j);
}
}
Exchange(A, i + 1,r);
returni + 1;
}
//交换两个数
voidExchange(intA[],intleft,intend) {
inttemp;
temp =A[left];
A[left] =A[end];
A[end] = temp;
int *array = new int[length];
for(int i = 0;i < length;i++)
{
array[i]=rand();
cout<<array[i]<<endl;
}
//调用时间函数
clock_t start,end;
start = clock();
QUICK_INSERT_SORT(array,length-1,k);
附录(源代码)
算法源代码(C/C++/JAVA描述)
//题目一:快速排序算法
#include<iostream>
usingnamespacestd;
#include<cstdlib>
#include<ctime>
intPARTITION(intA[],intp,intr);
voidExchange(intA[],intleft,intend);
《算法设计与分析》上机报告
姓名:
学号:
SA1722
日期:
2017.11
上机题目:
快速排序算法及优化
实验环境:
CPU:i5;内存:;操作系统:win10;软件平台:VS2015;
一、算法设计与分析:
题目一:
实现快速排序算法
题目二:
快速排序优化算法
二、核心代码:
题目一:
//把A数组分为两部分
intPARTITION(intA[],intp,intr) {
}
//递归调用快速排序算法
voidquick_sort(intA[],intp,intr)
{
intq=0;
if(p<r)
{
q = PARTITION(A,p,r);
quick_sort(A,p, q - 1);
quick_sort(A, q + 1,r);
}
}
//题目二:快速排序优化算法
#include <iostream>
{
int q=0;
if(r-p>k)
{
q = PARTITION(A,p,r);
quick_sort(A ,p, q-1,k);
quick_sort(A, q+1,r, k);
}
}
int MEDIAN(int A[],int p,int r)
{
int middle = (p + r)/2;
if(A[middle] < A[p]){
{
int x = MEDIAN(A,p,r);
int i = p - 1;
for(int j = p;j <= r - 1;j++)
{
if(A[j] <= x)
{
i = i + 1;
Exchange(A,i,j);
}
}
Exchange(A,i+1,r);
return i + 1;
}
void Exchange(int A[] , int left, int end) {
cout<<array[i]<<endl;
}
//调用时间函数,计算排序后程序运行的时间
clock_tstart, end;
start = clock();
quick_sort(array, 0, length-1);
for(inti = 0; i < length; i++)
{
cout<<array[i]<<endl;
int MEDIAN(int A[],int p,int r);
int PARTITION(int A[],int p,int r);
void Exchange(int A[] , int left, int end);
int main()
{
int length = 1000;
int k = 20;
Exchange(A,p,middle);
}
if(A[r] < A[p]){
Exchange(A,p,r);
}
if(A[r] < A[middle]){
Exchange(A,middle,r);
}
Exchange(A,middle,r - 1);
return A[r - 1];
}
int PARTITION(int A[],int p,int r)
int temp;
temp = A[left];
A[left] = A[end];
A[end] = temp;
}
{
intq=0;
if(p<r)
{
q = PARTITION(A,p,r);
quick_sort(A,p, q - 1);
quick_sort(A, q + 1,r);
}
}
题目二:
//对k=20规模时,对数组进行插入排序的算法
void QUICK_INSERT_SORT (int A[],int n,int k)
题目二:
下面是运行快速排序优化算法,首先生成1000个随机数组成的数组,然后对这1000个随机数进行排序,最后利用c++的时间函数对整个数组输出进行统计时间,得到的时间为495.相对于普通快速排序算法快了248.
四、备注(*可选):
有可能影响结论的因素:
总结:
经过优化后的快速排序算法先是进行快速排序不断进行分治,等分治后的分数个数达到20后进行插入排序,从而能减少了算法的时间。
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
void QUICK_INSERT_SORT(int A[],int n,int k);
void quick_sort(int A[], int p, int r,int k);
quick_sort(A,0,n,k);
int i=0;
int x=0;
for(int j=1;j<=n;j++)
{
x = A[j];
i = j;
while(i > 0 && A[i - 1] > x)
相关文档
最新文档