Java实验1评价成绩_《Java程序设计》实验1实验报告

这篇博客展示了Java实验1的内容,主要比较了快速排序、选择排序和直接插入排序的时间复杂度。通过运行1000000次排序操作,计算每种排序算法的执行时间,并输出排序后的数组。此外,还实现了快速查找功能,允许用户输入数据并返回其在排序数组中的位置。实验中解决了数组溢出的问题,并讨论了Java中计算时间的语句与C的不同。
摘要由CSDN通过智能技术生成

20145318 《Java程序设计》实验1实验报告

实验题目

通过对500个数据进行操作,实现快速排序、选择排序、直接插入排序算法时间复杂度的比较;并在排序数据中快速查找某一数据,给出查找是否成功,以及数据所在的位置信息。

设计思路

本次实验利用数据结构实验的C转换成Java,设计思路见下图。

a56c007dc85708ac87db3aedf739fc54.png

源代码

import java.util.Scanner;

class Sort

{

public static void main(String[] args)

{

int N=20;

int[] a={5,2,8,9,4,3,1,7,0,6,15,12,18,19,14,13,11,17,10,16};

/*直接插入排序*/

long beginTime1=System.currentTimeMillis();//计算时间

for(int i=0;i<1000000;i++)

InsertSort(a, N);

long endTime1=System.currentTimeMillis();

System.out.println(endTime1-beginTime1+" 毫秒");

for (int i = 0; i < N; i++)

System.out.printf("%d\t", a[i]);

System.out.printf("\n");

/*快速排序*/

long beginTime2=System.currentTimeMillis();//计算时间

for(int i=0;i<1000000;i++)

QuickSort(a, 0, N-1);

long endTime2=System.currentTimeMillis();

System.out.println(endTime2-beginTime2+" 毫秒");

for (int i = 0; i < N; i++)

System.out.printf("%d\t", a[i]);

System.out.printf("\n");

/*选择排序*/

long beginTime3=System.currentTimeMillis();//计算时间

for(int i=0;i<1000000;i++)

SelectSort(a, N);

long endTime3=System.currentTimeMillis();

System.out.println(endTime3-beginTime3+" 毫秒");

for (int i = 0; i < N; i++)

System.out.printf("%d\t", a[i]);

System.out.printf("\n");

for(int i=0;i<2;i++){

/*快速查找(直接遍历查找)*/

int add=0;

System.out.printf("Input key=");

//输入数据

Scanner sc = new Scanner(System.in);

int key = sc.nextInt();

while (add

add++;

if (a[add]==key)

System.out.printf("%d的位置为%d\n", key, add + 1);

else

System.out.printf("不存在%d\n", key);

}

}

/*直接插入排序:*/

public static void InsertSort(int a[], int n)

{

int i, j, t;

for (i = 1; i < n; i++)

{

t = a[i];

for (j = i; j>0 && t < a[j - 1]; j--)

{

a[j] = a[j - 1];

}

a[j] = t;

}

}

/*快速排序:*/

public static void QuickSort(int b[], int low, int high)

{

int i, j, middle;

i = low;

j = high;

middle = b[low];

while (i < j)

{

while (i < j&&middle <= b[j])

j--;

if (i < j)

{

b[i] = b[j];

i++;

}

while (i < j&&b[i] < middle)

i++;

if (i < j)

{

b[j] = b[i];

j--;

}

}

b[i] = middle;

if (low < i)

QuickSort(b, low, i - 1);

if (i < high)

QuickSort(b, j + 1, high);

}

/*选择排序:*/

public static void SelectSort(int c[], int n)

{

int i, j, k, t;

for (i = 0; i < n; i++)

{

k = i;

for (j = i + 1; j < n;j++)

if (c[k]>c[j])

k = j;

if (k != i)

{

t = c[i];

c[i] = c[k];

c[k] = t;

}

}

}

}

结果截图

三种排序算法的结果和所消耗的时间分别显示,输入需要查找的关键字,若存在即输出位置,若不存在则说明。

036a999fd4cc97ae5856fd1e47fb37c6.png

问题及解决

Java中时间计算的语句与C中不同,这样比较方便。

long beginTime3=System.currentTimeMillis();//计算时间

执行语句

long endTime3=System.currentTimeMillis();

System.out.println(endTime3-beginTime3+" 毫秒");

排序过程可能耗时很短,可以通过循环执行排序来计算时间。

调试过程中出现了查找数组溢出的情况。

比较语句原代码:

while (a[add] != key&&add<=N)add++;if (add>=0&&add<=N)····

问题:&&先比较前者,为false即不比较后者;add<=N不满足再跳出循环,此时已经执行到add=N,所以溢出。

改正后代码:

while (add

改正:先判断add是否溢出再判断是否找到关键字;跳出循环时add++执行,此时add=N-1,不会溢出。

在一个类中,直接int N可以代替C中的#define N,但是多个类中用此方法定义常量不行。

PSP

83ac99aee02082d960958fa2ddd6be66.png

其他(感悟、思考等,可选)

本次实验直接引用数据结构的C,在设计过程上没有费太多时间,在Java和C不同的地方做些修改。

排序算法比较基本,掌握其排序本质即可。

实现以下功能,所有功能以图形用户界面完成。 <1> 新建课程考试成绩单,功能描述如下: n 程序界面显示已经开设的课程(从course.txt中读取),用户选择本次输入的课程。 n 程序界面通过文件对话框要求用户选择为哪个班输入成绩(即选择相应班的名单文件)。如果该班的成绩已经输入(已经存在对应成绩单文件),则提示无需输入。 n 程序提供界面为该班的每个学生输入考试成绩。 n 输入的成绩单以对象文件格式存储到文件中(不能是文本文件),文件命名为:班级-课程名.dat。例如:2010级网络工程1班-面向对象程序设计.dat。 <2> 打开课程考试成绩单,功能描述如下: n 程序通过文件对话框要求用户选择打开的成绩单文件。 n 程序打开并读取成绩单文件内容,并显示在界面中。 <3> 修改课程考试成绩单,功能描述如下: n 完成第<2>功能后,即打开某班某课程的成绩单后。 n 可以选择修改其中某个或某几个考试成绩,并保存。 <4> 课程考试成绩分析,功能描述如下: n 完成第<2>功能后,即打开某班某课程的成绩单后。 n 点击成绩分析按钮或菜单,显示如下分析内容: u 最高分:XX分,最低分:XX分,平均分:XX分 u 不及格(分数<60):XX人,占XX.XX% u 及格(60<=分数<70):XX人,占XX.XX% u 中等(70<=分数<80):XX人,占XX.XX% u 良好(80<=分数<90):XX人,占XX.XX% u 优秀(90<=分数<100):XX人,占XX.XX% <5> 成绩图形分析,功能描述如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值