算法一 算法引论

广东金融学院实验报告

课程名称:算法分析与设计

 

装订线

实验编号

 

及实验名称

实验一 算法引论

系 别

互联网金融与信息工程

姓   名

陈艺瀚

学    号

161616134

班  级

1615432

实验地点

5-503

实验日期

2018-9-22

实验时数

1

指导教师

 郭艺辉

同组其他成员

成  绩

 

一、实验目的及要求

  1. 明确算法的研究内容与研究目标。
  2. 掌握高效地对数据进行排序的方法。
  3. 掌握正确分析算法的复杂性的方法。

 

二、实验环境及相关情况(包含使用软件、实验设备、主要仪器及材料等)

  1. 主要仪器:微型计算机,55台,每人一台。
  2. 软件环境:Eclipse 3.0.1 SDK。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

三、实验内容及步骤(包含简要的实验步骤流程)

1、给定一组“无序”记录序列{5,3,1,9,8,2,4,7},编写程序,采用冒泡排序、堆排序以及直接选择排序方法对该序列按升序进行排序,完成以下问题:

  1. 给出冒泡排序、堆排序以及直接选择排序方法的Java实现代码。
  2. 采用上述三种方法进行排序的过程中,重要进行的两种基本操作是什么?
  3. 冒泡排序的过程中,进行第二趟排序后的结果。
  4. 写出采用堆排序方法建立的初始最小堆。
  5. 采用直接选择方法进行排序时,第5次交换和选择后,未排序记录是什么?
  6. 试比较上述三种排序算法的性能(时间复杂度)。

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+1arr[k])

            {

                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

  1. 时间复杂度为n:输入规模100n

时间复杂度为n^2:输入规模为10n

时间复杂度为n^3:输入规模为4.64n

  1. 原机器t秒内完成的程序条数: T=3*2^n

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. 明确算法的研究内容与研究目标。
  2. 掌握高效地对数据进行排序的方法。
  3. 掌握正确分析算法的复杂性的方法。

 

二、实验环境及相关情况(包含使用软件、实验设备、主要仪器及材料等)

  1. 主要仪器:微型计算机,55台,每人一台。
  2. 软件环境:Eclipse 3.0.1 SDK。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

三、实验内容及步骤(包含简要的实验步骤流程)

1、给定一组“无序”记录序列{5,3,1,9,8,2,4,7},编写程序,采用冒泡排序、堆排序以及直接选择排序方法对该序列按升序进行排序,完成以下问题:

  1. 给出冒泡排序、堆排序以及直接选择排序方法的Java实现代码。
  2. 采用上述三种方法进行排序的过程中,重要进行的两种基本操作是什么?
  3. 冒泡排序的过程中,进行第二趟排序后的结果。
  4. 写出采用堆排序方法建立的初始最小堆。
  5. 采用直接选择方法进行排序时,第5次交换和选择后,未排序记录是什么?
  6. 试比较上述三种排序算法的性能(时间复杂度)。

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+1arr[k])

            {

                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

  1. 时间复杂度为n:输入规模100n

时间复杂度为n^2:输入规模为10n

时间复杂度为n^3:输入规模为4.64n

  1. 原机器t秒内完成的程序条数: T=3*2^n

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日

                   

 

你可能感兴趣的:(算法)