20145205 java语言实现数据结构实验一
数据结构实验要求
综合类实验设计3
已知有一组数据a1a2a3a4……anb1b2b3b4……bm,其中ai均大于bj,但是a1到an和b1到bm不是有序的,试设计两到三个算法完成数据排序,且把bj数据全倒置到ai之前,并比较几个算法之间的时空复杂度。
编写实验代码过程中的问题和解决过程
因为之前提到使用java语言实现数据结构和密码学的实验可以加分,并且自己的C语言确实也是随着自己没有巩固练习而淡忘的差不多了,而且张岩老师也允许使用java语言进行实验实现,所以第一次的数据结构实验我选择了java语言实现。之前我所编写的代码中,错误的把题目看成了一个数组,所以在我自信满满的给老师验收代码的时候一下子就被指出理解题目有误,之后我在课上修改了代码,但是这次又将全导致这一概念理解错误了。
我理解的是,将整个数组排序后,将每个bj提到对应的ai前,但是啊,真确的全导致是全部的bj提到全部的ai前面,所以我又发了第二次理解错误。
package cc.openhome;
public class shiyan1
{
public static void main(String[] args)
{
int[] scores1 = {88,81,74,68,78,76,77,85,95,93,87,80,73,67,77,75,76,84,94,92};
int temp;
int size = scores1.length;
for (int i = 0; i < size - 1; i++)
{
for (int j = i + 1; j < size; j++)
{
if (scores1[i] < scores1[j])
{
temp = scores1[i];
scores1[i] = scores1[j];
scores1[j] = temp;
}
}
}
int temp1;
int size1 = scores1.length;
for (int a = 0 , b = 1; a <=size - 1 && b <= size; a=a+2,b=b+2)
{
if (scores1[a] > scores1[b])
{
temp1 = scores1[a];
scores1[a] = scores1[b];
scores1[b] = temp1;
}
}
for(int score : scores1)
{
System.out.printf("%3d",score);
}
System.out.println();
}
}
所以我不得不开始了第三次代码修改,这次我的思路是,先定义一个要求的数组,然后用两个数组分别copy原数组的ai部分和bj部分,之后进行排序,然后再将排序后数组合并打印出来。
为了实现这个思路我需要调用System.arraycopy
函数进行数组的copy,但是我自己的只会copy前半个数组int[] scores1 = Arrays.copyOf(shuju,shuju.length/2);
这个样子,后半个数组就不可以这个样子int[] scores2 = Arrays.copyOf(shuju.length/2,shuju.length);
所以我在博客园中找到了调用API的方法如下
这里再介绍一下System.arraycopy这个函数,从JAVA API中找了一段。大家看一下。连接在文末。
public static voidarraycopy(Object src, int srcPos, Object dest, int destPos, int length)从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。从src引用的源数组到dest引用的目标数组,数组组件的一个子序列被复制下来。被复制的组件的编号等于length参数。源数组中位置在srcPos到srcPos+length-1之间的组件被分别复制到目标数组中的destPos到destPos+length-1位置。
如果参数src和dest引用相同的数组对象,则复制的执行过程就好像首先将srcPos到srcPos+length-1位置
的组件复制到一个带有length组件的临时数组,然后再将此临时数组的内容复制到目标数组的destPos到
destPos+length-1位置一样。
If 如果dest为null,则抛出NullPointerException异常。
如果src为null, 则抛出NullPointerException异常,并且不会修改目标数组。
否则,只要下列任何情况为真,则抛出ArrayStoreException异常并且不会修改目标数组:
src参数指的是非数组对象。
dest参数指的是非数组对象。
src参数和dest参数指的是那些其组件类型为不同基本类型的数组。
src参数指的是具有基本组件类型的数组且dest参数指的是具有引用组件类型的数组。
src参数指的是具有引用组件类型的数组且dest参数指的是具有基本组件类型的数组。
否则,只要下列任何情况为真,则抛出IndexOutOfBoundsException异常,并且不会修改目标数组:
srcPos参数为负。
destPos参数为负。
length参数为负。
srcPos+length大于src.length,即源数组的长度。
destPos+length大于dest.length,即目标数组的长度。
否则,如果源数组中srcPos到srcPos+length-1位置上的实际组件通过分配转换并不能转换成目标数组的组
件类型,则抛出ArrayStoreException异常。在这种情况下,将k设置为比长度小的最小非负整数,这样就
无法将src[srcPos+k]转换为目标数组的组件类型;当抛出异常时,从srcPos到srcPos+k-1位置上的源数组
组件已经被复制到目标数组中的destPos到destPos+k-1位置,而目标数组中的其他位置不会被修改。(因
为已经详细说明过的那些限制,只能将此段落有效地应用于两个数组都有引用类型的组件类型的情况。)
参数:src- 源数组。
srcPos- 源数组中的起始位置。
dest- 目标数组。
destPos-
目标数据中的起始位置。
length-
要复制的数组元素的数量。
抛出:IndexOutOfBoundsException-
如果复制会导致对数组范围以外的数据的访问。
ArrayStoreException- 如果因为类型不匹配而使得无法将src数组中的元素存储到dest数组中。
NullPointerException- 如果src或dest为null。
之后修改后得得到了可以运行的代码,但是因为我的eclipse版本过低所以无法运行在JDK1.6之后的函数,大家有兴趣可以copy下来代码去运行一下。
package cc.openhome;
import java.util.Arrays;//调用这个Arrays类进行数组的复制
import java.lang.System;//调用这个类进行输出
public class shiyan2
{
public static int[] contact(int scores1[], int scores2[]){
int[] f = new int[scores1.length+scores2.length];
for(int i = 0 ; i < f.length; i++)
if(i < scores1.length)
f[i] = scores1[i];
else
f[i]= scores2[i-scores1.length];
return f;//以上是对于排序好的两个数组合并成一个新的数组时的函数的建立,复制时只按照两个数组的元素先后顺序,所以需要排序好后再进行复制。
}
public static void main(String[] args)
{
int[] shuju ={88,81,74,68,78,76,77,85,95,93,87,80,73,67,77,75,76,84,94,92};//原数组的赋值
int[] scores1 = Arrays.copyOf(shuju,shuju.length/2);//将ai从原数组拆分出来
int scores2[] = new int[10];//定义新数组用来复制bj
System.arraycopy(shuju[10],scores2[0],shuju.length);//从原数组的第十位开始复制,复制到新数组的开始,之后依次复制。
int temp; //定义中间变量
int size = scores1.length; //定义ai数组的长度变量
for (int i = 0; i < size - 1; i++) //冒泡排序,开始遍历ai数组
{
for (int j = i + 1; j < size; j++)
{
if (scores1[i] < scores1[j])
{ // 交换两数的位置
temp = scores1[i]; //不断两两交换,将小数不断交换到数组前
scores1[i] = scores1[j];
scores1[j] = temp;
}
}
}
int size2 = scores2.length; //同对于ai数组的进行的冒泡排序进行对bj数组进行排序
for (int i = 0; i < size2 - 1; i++) {
for (int j = i + 1; j < size2; j++) {
if (scores2[i] < scores2[j]) {
temp = scores2[i];
scores2[i] = scores2[j];
scores2[j] = temp;
}
}
}
int scores3[] =ContactIntegerArray.contact(scores2, scores1);//合并数组时将bj数组放到ai数组前
for(int score : scores3)
{
System.out.printf("%3d",score);//打印合并数组
}
System.out.println();//输出换行
}
}
其他(感悟、思考等,可选)
在本周的学习中书上代码比较多,由其是第一次见识到了五十行以上的长代码,在敲的时候因为开始的不是很理解,导致自己有次看串了行,编译的时候总是有错误,后来发现了这点,我删除了之前的建的class,然后先去看书,在基本理解代码之后重新敲代码,这次因为有着之前的经验和自己的对于代码的理解,中间也丢了几行代码但是自己在敲的时候,发现了程序缺了东西,立马就补了回来。
而且现在我们最近在做数据结构的实验,在之前写大致的实验预习代码的时候,我就是使用的JAVA语言,实验要求是几个排序算法解决问题,之前我用的思想其实基本上和C语言中的思想差不多,就是用java语言表达了出来,像是冒泡排序,但是第九章Sort系列给了我新的思路,打算之后改进代码的时候,结合书上的内容,进行一定改进,希望在之后的学习中,可以将JAVA语言和其他科目的编程实验进行融会贯通,不要只是学过了就是学过了。
参考资料
20145205 java语言实现数据结构实验一的更多相关文章
- 数据结构(java语言描述)
概念性描述与<数据结构实例教程>大同小异,具体参考:http://www.cnblogs.com/bookwed/p/6763300.html. 概述 基本概念及术语 数据 信息的载体,是 ...
- 数据结构(Java语言描述)-第一章:概述
第一章 概述 1.0 序言 自己为啥要学数据结构嘞,我觉得主要有以下三个原因: 前段时间在看并发编程时,发现aqs,corrunthashmap等底层都用到了数据结构,主要的有队列,还有链表,学习数据 ...
- Java程序设计与数据结构导论--读后感
与我前面所读的<Java7基础教程>相比,此书不适合自学,更适合作为教材使用. 虽然此书完整覆盖了Java的知识点和数据结构的基础问题,并且对每个部分都做了基本说明.但是因为没有深入展开, ...
- java项目——数据结构实验报告
java项目——数据结构总结报告 20135315 宋宸宁 实验要求 1.用java语言实现数据结构中的线性表.哈希表.树.图.队列.堆栈.排序查找算法的类. 2.设计集合框架,使用泛型实现各类. ...
- 20172302 《Java软件结构与数据结构》实验三:查找与排序实验报告
课程:<Java软件结构与数据结构> 班级: 1723 姓名: 侯泽洋 学号:20172302 实验教师:王志强老师 实验日期:2018年11月19日 必修/选修: 必修 实验内容 (1) ...
- 20172302 《Java软件结构与数据结构》实验二:树实验报告
课程:<Java软件结构与数据结构> 班级: 1723 姓名: 侯泽洋 学号:20172302 实验教师:王志强老师 实验日期:2018年11月5日 必修/选修: 必修 实验内容 (1)参 ...
- 20172302 《Java软件结构与数据结构》实验一:线性结构实验报告
课程:<Java软件结构与数据结构> 班级: 1723 姓名: 侯泽洋 学号:20172302 实验教师:王志强老师 实验日期:2018年9月26日 必修/选修: 必修 实验内容 (1)链 ...
- 20172301 《Java软件结构与数据结构》实验三报告
20172301 <Java软件结构与数据结构>实验三报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 郭恺 学号:20172301 实验教师:王志强老师 ...
- 20172301 《Java软件结构与数据结构》实验二报告
20172301 <Java软件结构与数据结构>实验二报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 郭恺 学号:20172301 实验教师:王志强老师 ...
随机推荐
- 微信小程序开发视频教程新鲜出炉
微信小程序开发公测了,可是对于新手来说,不同的框架不同的开发机制,如何快速适应呢?微信小程序开发视频教程新鲜出炉了,从零开始一步一步搭建微信小程序,每个章节都会涉及到不同的知识点,等教程学习完你不但掌 ...
- Openstack4j 在 Maven 中的构建
什么是 Openstack4j ? OpenStack的官方SDK是基于Python语言的,对于Java程序猿来说,将Python翻译过来未免麻烦.在Openstack官方的Wiki中(戳我直达),我 ...
- Xcode 此证书签发者无效
1.https://developer.apple.com/certificationauthority/AppleWWDRCA.cer 安装此证书 2.在keychains里选择login,然后点选 ...
- putty可以远程连接linux,但上不了网(nat模式)
话说,这个问题搞了我一个下午 = = 不过终于可以用NAT模式上网了,还是挺有成就感的 首先放张这样的图上去 证明putty 连linux 是木有问题的,但是上不了网哦~~~ 大家请注意, 当前ip是 ...
- 动态选路、RIP协议&&OSPF协议详解
动态选路.RIP协议&&OSPF协议详解 概念 当相邻路由器之间进行通信,以告知对方每个路由器当前所连接的网络,这时就出现了动态选路.路由器之间必须采用选路协议进行通信,这样的选路协议 ...
- Unity VR全景漫游
一.前言: 最近VR如火如茶,再不学习就落伍啦.有空闲时间,跟Rodolfo一起研究下相关知识. 本文介绍了两种方法来制作VR场景: 方法一:通过6张小图搭建的VR场景 方法二:通过一张全景图来搭建V ...
- 如何快速的解决Maven依赖冲突
为什么会出现依赖冲突 首先要说明Maven的依赖管理,具体的可以参考这边 Maven学习——依赖管理 这篇文章,maven在依赖冲管理中有一下几个原则. 依赖是使用Maven坐标来定位的,而Maven ...
- C#回顾 –5.反射
]; //获取构造函数 var obj = ci.Invoke(null);//实例化构造函数 T1.InvokeMember(funName, BindingFlags.InvokeMethod ...
- CSS常用知识点
块级元素:width宽和height高有效. 内联元素:width宽和height高无效. 1.float:该属性的值指出了对象是否及如何浮动. none:设置对象不浮动left:设置对象浮在左边ri ...
- Knockout.js随手记(3)
下拉菜单 <select>也是网页设计重要的一环,knockout.js(以下简称KO)也有不错的支持.针对<select>,在data-bind除了用value可对应下拉菜单 ...