/* 编程作业 2.1 向highArray.java程序(清单2.3)的HighArray类添加一个名为getMax()的方法,它返回 数组中最大关键字的值,当数组为空时返回-1。向main()中添加一些代码来使用这个方法。 可以假设所有关键字都是正数。 2.2 修改编程作业2.1中的方法,使之不仅返回最大的关键字,而且还将该关键字从数组中删除。 将这个方法命名为removeMax()。 2.3 编程作业2.2中的removeMax()方法提供了一种通过关键字值进行数组排序的方法。实现一个 排序方案,要求不修改HighArray类,只需对main()中的代码进行修改。这个方法需要第二个 数组,在排序结束时数组数据项是逆序排列的。(这个方法是第3章“简单排序”中选择排序的 一个变体。) 2.4 修改orderedArray.java程序(清单2.4)使insert()、delete()与find()方法一样都使用 二分查找,正如书中所建议的那样。 2.5 向orderedArray.java程序(清单2.4)的OrdArray类加入一个merge()方法,使之可以将两个 有序的源数组合并成一个有序的目的数组。在main()中添加代码,向两个源数组中插入随机数, 调用merge()方法,并将结果目的数组显示出来。两个源数组的数据项个数可能不同。在算法中 需要先比较源数组中的关键字,从中选出最小的一个数据项复制到目的数组。同时还要考虑如何 解决当一个源数组的数据项已经取完而另一个还剩一些数据项情况。 2.6 向highArray.java程序(清单2.3)的HighArray类中加入一个noDup()方法,使之可以将数组中 的所有重复数据项删除。即如果数组中有三个数据项的关键字为17,noDup()方法会删除其中的 两个。不必考虑保持数据项的顺序。一种方法是先用每一个数据项同其他数据项比较,并用null (或是一个不会用在真正的关键字中的特殊值)将重复的数据项覆盖掉。然后将所有的null删除, 当然还要缩小数组的大小。 */
package 数据结构作业; public class HighArray { private long [] a; private int nElems; public HighArray(int max) { a = new long[max]; nElems = 0; } //查找的方法的实现 public boolean find(long searchKey) { int j; for(j=0;j<nElems;j++) { if(a[j] == searchKey) { break; } } if(j == nElems) { return false; }else{ return true; } } //插入元素的实现 public void insert(long value) { a[nElems] = value; nElems++; } //删除元素的实现 public boolean delete(long value) { int j; for(j=0;j<nElems;j++) { if(value == a[j]) { break; } } if(j == nElems) { return false; }else{ for(int k = j;k<nElems;k++) { a[k] = a[k+1];//// 这里不是多移了一次 当k=nElems-1时, a[nElems-1] = a[nElems]; 此时a[nElems]为空 } nElems--; return true; } } public void display() { for (int j = 0; j < nElems; j++) // for each element, System.out.print(a[j] + " "); // display it System.out.println(""); } //作业2.1 public long getMax() { long max = -1;//最大元素的值 for(int j=0;j<nElems;j++) { if(a[j] > max) { max = a[j]; } } return max; } //作业2.2 public long removeMax() { long max = -1;//最大元素的值 int index = -1;//最大元素的索引号 for(int j=0;j<nElems;j++) { if(a[j] > max) { max = a[j]; index = j; } } if(index != -1)//找到最大元素的值 { for(int i = index+1;i<nElems;i++) { a[i-1] = a[i]; } nElems--; } return max; } /** * 向highArray.java程序(清单2.3)的HighArray类中加入一个noDup()方法,使之可以将数组中 的所有重复数据项删除。即如果数组中有三个数据项的关键字为17,noDup()方法会删除其中的 两个。不必考虑保持数据项的顺序。一种方法是先用每一个数据项同其他数据项比较,并用null (或是一个不会用在真正的关键字中的特殊值)将重复的数据项覆盖掉。然后将所有的null删除, 当然还要缩小数组的大小。 */ public void noDup() { int NULL = -1;//用-1作为一个特殊值 for(int j=0;j<nElems;j++) { for(int i=j+1;i<nElems;i++) { if(a[j] != NULL && a[j] == a[i]) { a[i] = NULL; } } } for(int i=0;i<nElems;) { if(a[i] == NULL)//注意移动完成之后不要i++,再次检查当前位置是不是NULL { for(int j = i+1;j<nElems;j++) { a[j-1] = a[j]; } nElems--; }else{ i++;//不是NULL,就直接i++. } } } } ---------------------------------------------------------------------------------package 数据结构作业; /** * 向highArray数组中添加一个名为getMax的方法 * 它返回的是最大的关键字的值 * @author Administrator * */ public class demo2 { public static void main(String[] args) { int maxSize = 100; HighArray arr = new HighArray(maxSize); arr.insert(77); // insert 10 items arr.insert(99); arr.insert(44); arr.insert(55); arr.insert(22); arr.insert(88); arr.insert(11); arr.insert(00); arr.insert(66); arr.insert(33); arr.display(); // display items int searchKey = 35; // search for item if (arr.find(searchKey)) System.out.println("Found " + searchKey); else System.out.println("Can‘t find " + searchKey); arr.delete(00); // delete 3 items arr.delete(55); arr.delete(99); arr.display(); // display items again // ======================================================= // 编程作业2.1 long max = arr.getMax(); System.out.println("Found max is " + max); // ======================================================= // 编程作业2.2 arr.removeMax(); arr.display(); // ======================================================= // 编程作业2.3 HighArray sortedArr = new HighArray(maxSize); int i = 0; max = arr.removeMax(); while (max != -1) { sortedArr.insert(max); max = arr.removeMax(); } System.out.println("逆序排列:"); sortedArr.display(); // ======================================================= arr.insert(77); // insert 10 items arr.insert(99); arr.insert(44); arr.insert(55); arr.insert(22); // 重复值 arr.insert(44); arr.insert(77); arr.insert(44); arr.insert(66); arr.insert(88); arr.insert(11); arr.insert(00); arr.insert(66); arr.insert(33); System.out.println("加入重复值后:"); arr.display(); // arr.noDup(); arr.noDup(); System.out.println("去掉重复值后:"); arr.display(); // ======================================================= } }
时间: 2024-10-13 06:28:34