广东金融学院实验报告
课程名称:算法分析与设计
及实验名称 |
实验一 算法引论 |
系 别 |
互联网金融与信息工程 |
|||||||
姓 名 |
陈艺瀚 |
学 号 |
161616134 |
班 级 |
1615432 |
|||||
实验地点 |
5-503 |
实验日期 |
2018-9-22 |
实验时数 |
1 |
|||||
指导教师 |
郭艺辉 |
同组其他成员 |
无 |
成 绩 |
|
|||||
一、实验目的及要求
|
||||||||||
二、实验环境及相关情况(包含使用软件、实验设备、主要仪器及材料等)
|
||||||||||
三、实验内容及步骤(包含简要的实验步骤流程) 1、给定一组“无序”记录序列{5,3,1,9,8,2,4,7},编写程序,采用冒泡排序、堆排序以及直接选择排序方法对该序列按升序进行排序,完成以下问题:
2、问题提出:公元前5世纪末,中国古代数学家张丘建在他的《算经》中提出了著名的 “百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?即一百个铜钱买了一百只鸡,其中公鸡一只5钱、母鸡一只3钱,雏鸡一钱3只,问一百只鸡中公鸡、母鸡、雏鸡各多少? 算法的伪代码如下: For x = 0 to 100 For y = 0 to 100 For z = 0 to 100 If (x+y+z=100) and (5*x + 3*y + z/3 = 100) Then List1.AddItem Str(x) + " " + Str(y) + " " + Str(z) End If 对上述算法做出改进以提高算法的效率,要求将算法的时间复杂性由Ο(n3)降为 Ο(n2),并将改进的算法编程实现。 3、硬件厂商XYZ公司宣称他们研制的微处理器的运行速度是其竞争对手ABC公司同类产品的的100倍,问对于计算复杂性分别为n,n2,n3的各类算法,若用ABC公司的计算机能在1小时内解决输入规模为n的问题,那么用XYZ公司的计算机在1小时内分别能解决输入规模为多大的的问题? 4、假设某算法在输入规模为n时的计算时间为T(N)=3*2n。在某台计算机上实现并完成该算法在t秒。现有另一台计算机,其运行速度为第一台的64倍,那么在这台新机器上用同一算法在t秒内能解输入规模为多大的问题?
|
||||||||||
1) (1). package SortType; import java.lang.reflect.Array; import java.util.Arrays; public class BubbleSort { public static void main(String[] args) { int[] arr={5,3,1,9,8,2,4,7}; sort(arr); System.out.print(Arrays.toString(arr)); } public static void sort(int[] arr) { for(int i=0;i { for(int j=arr.length-1;j>=i+1;j--) { int temp=arr[j]; if(arr[j]<=arr[j-1]) { arr[j]=arr[j-1]; arr[j-1]=temp; } } } } } ----------------------------------------------------------------------- |
||||||||||
package SortType; import java.util.Arrays; public class HeapSort1 { public static void main(String args[]) { int[] arr={5,3,1,9,8,2,4,7}; sort(arr); System.out.println(Arrays.toString(arr)); } public static void sort(int[] arr) { for(int i=arr.length/2-1;i>=0;i--) { AdjustHeap(i,arr,arr.length); } for(int j=arr.length-1;j>0;j--) { swap(j,arr); AdjustHeap(0,arr,j); } } public static void swap(int j,int[] arr) { int temp=arr[0]; arr[0]=arr[j]; arr[j]=temp; } public static void AdjustHeap(int i,int[] arr,int length) { int temp=arr[i]; for(int k=2*i+1;k { if(k+1 { k++; } |
||||||||||
if(arr[k]>temp) { arr[i]=arr[k]; i=k; } else { break; } arr[i]=temp; } } } package SortType; import java.util.Arrays; public class selectSort { public static void main(String[] args) { int[] arr={5,3,1,9,8,2,4,7}; sort(arr); System.out.print(Arrays.toString(arr)); } public static void sort(int[] arr) { for(int i=0;i< arr.length-1;i++) { int tempi=arr[i]; int j=i+1; int min=arr[j]; int k=0; for(j=i+1;j<=arr.length-1;j++) { if(arr[j]<=min) { min=arr[j]; k=j; } } |
||||||||||
if(arr[k] { arr[i]=arr[k]; arr[k]=tempi; } } } } ------------------------------------------------------------------------ 2) 算术比较,算术移动 3)[1, 2, 5, 3, 4, 9, 8, 7] 4) [9,8,4,7,5,2,1,3] 5) 8,9,7 6) 冒泡排序:O(n*2) 堆排序:O(nlogn) 选择排序:O(n*2) 2. package wenti;
public class jiwenti { public static void main(String[] args) { int i=0,j=0; float k=0; for(i=0;i<=100;i++) { int sum=100; for(j=0;j<=100;j++) { k=100-i-j; if(k>=0&&k<=100&&sum==5*i+3*j+k/3) { System.out.println(i+","+j+","+k); break; } } } } }
|
||||||||||
0,25,75 4,18,78 8,11,81 12,4,84
时间复杂度为n^2:输入规模为10n 时间复杂度为n^3:输入规模为4.64n
n=log2(T/3) 新机器t秒内完成的程序条数: T1=64*3*2^n 输入的程序规模为 n1=log2(T1/3)=n+6 |
||||||||||
本次实验我了解了冒泡排序,堆排序和选择排序,发现堆排序的时间复杂性最小,在规模较大的输入模型中可以选择堆排序来完成排序,提高排序效率。
|
||||||||||
六、教师评语 1、完成所有规定的实验内容,实验步骤正确,结果正确; 2、完成绝大部分规定的实验内容,实验步骤正确,结果正确; 3、完成大部分规定的实验内容,实验步骤正确,结果正确; 4、基本完成规定的实验内容,实验步骤基本正确,所完成的结果基本正确; 5、未能很好地完成规定的实验内容或实验步骤不正确或结果不正确。 6、其它:
评定等级:优秀 良好 中等 及格 不及格 教师签名:郭艺辉 2019年09月03日 |
||||||||||
广东金融学院实验报告
课程名称:算法分析与设计
及实验名称 |
实验一 算法引论 |
系 别 |
互联网金融与信息工程 |
|||||||
姓 名 |
陈艺瀚 |
学 号 |
161616134 |
班 级 |
1615432 |
|||||
实验地点 |
5-503 |
实验日期 |
2018-9-22 |
实验时数 |
1 |
|||||
指导教师 |
郭艺辉 |
同组其他成员 |
无 |
成 绩 |
|
|||||
一、实验目的及要求
|
||||||||||
二、实验环境及相关情况(包含使用软件、实验设备、主要仪器及材料等)
|
||||||||||
三、实验内容及步骤(包含简要的实验步骤流程) 1、给定一组“无序”记录序列{5,3,1,9,8,2,4,7},编写程序,采用冒泡排序、堆排序以及直接选择排序方法对该序列按升序进行排序,完成以下问题:
2、问题提出:公元前5世纪末,中国古代数学家张丘建在他的《算经》中提出了著名的 “百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?即一百个铜钱买了一百只鸡,其中公鸡一只5钱、母鸡一只3钱,雏鸡一钱3只,问一百只鸡中公鸡、母鸡、雏鸡各多少? 算法的伪代码如下: For x = 0 to 100 For y = 0 to 100 For z = 0 to 100 If (x+y+z=100) and (5*x + 3*y + z/3 = 100) Then List1.AddItem Str(x) + " " + Str(y) + " " + Str(z) End If 对上述算法做出改进以提高算法的效率,要求将算法的时间复杂性由Ο(n3)降为 Ο(n2),并将改进的算法编程实现。 3、硬件厂商XYZ公司宣称他们研制的微处理器的运行速度是其竞争对手ABC公司同类产品的的100倍,问对于计算复杂性分别为n,n2,n3的各类算法,若用ABC公司的计算机能在1小时内解决输入规模为n的问题,那么用XYZ公司的计算机在1小时内分别能解决输入规模为多大的的问题? 4、假设某算法在输入规模为n时的计算时间为T(N)=3*2n。在某台计算机上实现并完成该算法在t秒。现有另一台计算机,其运行速度为第一台的64倍,那么在这台新机器上用同一算法在t秒内能解输入规模为多大的问题?
|
||||||||||
1) (1). package SortType; import java.lang.reflect.Array; import java.util.Arrays; public class BubbleSort { public static void main(String[] args) { int[] arr={5,3,1,9,8,2,4,7}; sort(arr); System.out.print(Arrays.toString(arr)); } public static void sort(int[] arr) { for(int i=0;i { for(int j=arr.length-1;j>=i+1;j--) { int temp=arr[j]; if(arr[j]<=arr[j-1]) { arr[j]=arr[j-1]; arr[j-1]=temp; } } } } } ----------------------------------------------------------------------- |
||||||||||
package SortType; import java.util.Arrays; public class HeapSort1 { public static void main(String args[]) { int[] arr={5,3,1,9,8,2,4,7}; sort(arr); System.out.println(Arrays.toString(arr)); } public static void sort(int[] arr) { for(int i=arr.length/2-1;i>=0;i--) { AdjustHeap(i,arr,arr.length); } for(int j=arr.length-1;j>0;j--) { swap(j,arr); AdjustHeap(0,arr,j); } } public static void swap(int j,int[] arr) { int temp=arr[0]; arr[0]=arr[j]; arr[j]=temp; } public static void AdjustHeap(int i,int[] arr,int length) { int temp=arr[i]; for(int k=2*i+1;k { if(k+1 { k++; } |
||||||||||
if(arr[k]>temp) { arr[i]=arr[k]; i=k; } else { break; } arr[i]=temp; } } } package SortType; import java.util.Arrays; public class selectSort { public static void main(String[] args) { int[] arr={5,3,1,9,8,2,4,7}; sort(arr); System.out.print(Arrays.toString(arr)); } public static void sort(int[] arr) { for(int i=0;i< arr.length-1;i++) { int tempi=arr[i]; int j=i+1; int min=arr[j]; int k=0; for(j=i+1;j<=arr.length-1;j++) { if(arr[j]<=min) { min=arr[j]; k=j; } } |
||||||||||
if(arr[k] { arr[i]=arr[k]; arr[k]=tempi; } } } } ------------------------------------------------------------------------ 2) 算术比较,算术移动 3)[1, 2, 5, 3, 4, 9, 8, 7] 4) [9,8,4,7,5,2,1,3] 5) 8,9,7 6) 冒泡排序:O(n*2) 堆排序:O(nlogn) 选择排序:O(n*2) 2. package wenti;
public class jiwenti { public static void main(String[] args) { int i=0,j=0; float k=0; for(i=0;i<=100;i++) { int sum=100; for(j=0;j<=100;j++) { k=100-i-j; if(k>=0&&k<=100&&sum==5*i+3*j+k/3) { System.out.println(i+","+j+","+k); break; } } } } }
|
||||||||||
0,25,75 4,18,78 8,11,81 12,4,84
时间复杂度为n^2:输入规模为10n 时间复杂度为n^3:输入规模为4.64n
n=log2(T/3) 新机器t秒内完成的程序条数: T1=64*3*2^n 输入的程序规模为 n1=log2(T1/3)=n+6 |
||||||||||
本次实验我了解了冒泡排序,堆排序和选择排序,发现堆排序的时间复杂性最小,在规模较大的输入模型中可以选择堆排序来完成排序,提高排序效率。
|
||||||||||
六、教师评语 1、完成所有规定的实验内容,实验步骤正确,结果正确; 2、完成绝大部分规定的实验内容,实验步骤正确,结果正确; 3、完成大部分规定的实验内容,实验步骤正确,结果正确; 4、基本完成规定的实验内容,实验步骤基本正确,所完成的结果基本正确; 5、未能很好地完成规定的实验内容或实验步骤不正确或结果不正确。 6、其它:
评定等级:优秀 良好 中等 及格 不及格 教师签名:郭艺辉 2019年09月03日 |
||||||||||