数据结构实验要求
综合类实验设计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语言和其他科目的编程实验进行融会贯通,不要只是学过了就是学过了。