当前位置:文档之家› 算法导论实验

算法导论实验

《算法导论》课程实验报告(院)系数理系 _ _____ 专业 ______ _信息与计算科学________ ____ 班级信科1001班学号_ 20 08 15__ 学生姓名刘俊伟_ 曹玮王舒斌指导教师_ 阳卫锋 ______ _____《算法导论》实验指导书实验目标通过实验,使同学掌握并能熟练运用散列表、贪心算法、动态规划算法。

实验三计数排序实验目的:掌握利用计数排序进行排序。

实验内容:对数组利用计数排序进行排序。

实验要求:1)利用计数排序法。

2)记录每一步数组的中元素的变化代码:import java.awt.BorderLayout;import java.awt.Button;import ponent;import java.awt.Frame;import bel;import java.awt.Panel;import java.awt.TextArea;import java.awt.TextField;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.geom.Area;import javax.swing.Box;import javax.swing.JFrame;class CountingSort extends Frame {public static void main(String[] args) {new CountingSort().lauchFrame();}private void lauchFrame() {Frame f = new JFrame("计数排序");f.setBounds(350, 150, 600, 300);Box horizontal = Box.createHorizontalBox();Box vertical = Box.createVerticalBox();final TextField tf = new TextField(50);Button button = new Button("排序");final TextArea ta = new TextArea();horizontal.add(tf);horizontal.add(button);vertical.add(ta);f.add(horizontal, BorderLayout.NORTH);f.add(vertical);tf.setText("请输入数字,以空格隔开");button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String str1 = tf.getText();if(str1.startsWith(" ")) {ta.setText("请按正确的格式输入!!!");try {Thread.sleep(10000);} catch (InterruptedException e1) {e1.printStackTrace();}System.exit(-1);}int[] a = new CountingSort().getArr(str1);Sort s = new Sort(a);s.method(s.getK(a));int[] b = s.getB();String str2 = " ";for(int i = 0; i < b.length; i++) {str2 = str2 + b[i] + " ";}str1 = "排序前:" + str1;str2 = "排序后:" + str2;ta.setText(str1 + "\n" +str2);}});f.setVisible(true);}private int[] getArr(String str) {String[] strArr = str.split(" ");int[] a = new int[strArr.length];for (int i = 0; i < strArr.length; i++) { a[i] = Integer.valueOf(strArr[i]);}return a;}}package com.algorithm1;class Sort //计数排序类 {private int[] c;//计数数组private int[] b;//通过计数排序之后的数组private int[] a;//原数组Sort(int[] a) {this.a = a;b = new int[a.length];}public void method(int k) {int[] c = new int[k+1];for (int i = 0; i < k ; i++ ) {c[i] = 0;}for (int j = 0; j < a.length ; j++ ) {c[a[j]] = c[a[j]] + 1;}for (int i = 1; i <= k ; i++ ) {c[i] = c[i] + c[i-1];}for (int j = a.length -1; j >= 0 ; j-- ) {b[c[a[j]]-1] = a[j];c[a[j]] = c[a[j]] - 1;}}public int getK(int[] a)//获取K值 {int k = a[0];//假设a[0]是最大值for (int i = 1 ; i < a.length ; i++ ) {if (k < a[i]) {k = a[i];}}return k;}public int[] getB() {return b;}}运行结果:实验四动态规划程序设计实验目的:掌握并实现动态规划算法。

实验内容:对比如维数为序列(5,10,3,12,5,50,6)的各矩阵。

找出其矩阵链乘的一个最优加全括号。

实验要求:利用动态规划思想写出算法的伪代码和C程序代码代码:public class MatrixMulitply {public static void main(String[] args) {int[] matrixChain = {25, 15, 15, 5, 10, 20, 25};matrixMultiply(matrixChain);} //矩阵连乘public static void matrixMultiply(int[] matrixChain) {int dimension = matrixChain.length;int[][] timeResult = new int[dimension][dimension];int[][] tagResult = new int[dimension][dimension];matrixMultiply(matrixChain, timeResult, tagResult);System.out.println("划分规则为:");traceBack(tagResult, 1, dimension - 1);} //矩阵连乘public static void matrixMultiply(int[] matrixChain, int[][] timeResult, int[][] tagResult) {//timeResult 存放次数结果,矩阵的的行与列以1开始,tagResult 存放标记结果,矩阵的的行与列以1开始int n = matrixChain.length - 1;for(int i = 1; i <= n; i++) //初始化矩阵timeResult[i][i] = 0;for(int r = 2; r <= n; r++) //从列号的第二位开始for(int i = 1; i <= n - r + 1; i++ ) { //i为行号int j = i + r - 1; //j为列号timeResult[i][j] = timeResult[i + 1][j] + matrixChain[i - 1] * matrixChain[i] * matrixChain[j];tagResult[i][j] = i;for(int k = i + 1; k < j; k++) {int temp = timeResult[i][k] + timeResult[k + 1][j]+ matrixChain[i - 1] * matrixChain[k] * matrixChain[j];if(temp < timeResult[i][j]) { //寻找最小值timeResult[i][j] = temp;tagResult[i][j] = k; //记录划分标记}}}} //按计算出断点矩阵tagResult指示的加括号方式public static void traceBack(int[][] tagResult, int i, int j) { if(i == j) return;traceBack(tagResult, i, tagResult[i][j]);traceBack(tagResult, tagResult[i][j] + 1, j);System.out.println("Multiply A(" + i + "," + tagResult[i][j] + ")and A(" + (tagResult[i][j] + 1) + "," + j + ")");}}运行结果:实验五贪心算法程序设计实验目的:掌握贪心算法。

实验内容:设n是一个正整数。

现在要求将n分解为若干个互不相同的自然数的和,且使这些自然数的乘积最大。

对于给定的正整数n,编程计算最优分解方案。

实验要求:利用贪心算法思想写出算法的伪代码和C程序代码。

代码:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class TanXin {public int N = this.GetN();public int[] A = new int[100];// 取得用户需要实现算法的一个正整数public int GetN() {int dvalue = 0;String value;System.out.print("请输入一个正整数: ");BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));try {value = bfr.readLine();dvalue = Integer.parseInt(value);//如果输入的不是数字,系统自动退出,并提示:“输入正确的数值!”。

相关主题