/**
* 编程作业
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 chap2;

/**
* 编程作业
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删除,
当然还要缩小数组的大小。
*/
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];
}
nElems--;
return true;
}
} public void display()
{
for (int j = 0; j < nElems; j++)
System.out.print(a[j] + " ");
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;
} //编程作业2.6
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 chap2;

/**
* Created by admin on 2018/11/15.
*/
public class HighArrayApp { public static void main(String[] args) {
int maxSize = 100; // array size
HighArray arr; // reference to array
arr = new HighArray(maxSize); // create the array 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 // =======================================================
// p50(69) 编程作业2.1
long max = arr.getMax();
System.out.println("Found max is " + max);
// =======================================================
// p50(69) 编程作业2.2
arr.removeMax();
arr.display();
// =======================================================
// p50(69) 编程作业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.noDup1();
System.out.println("去掉重复值后:");
arr.display();
}
}
package chap2;

/**
* Created by admin on 2018/11/15.
*/
public class OrdArray { private long[]a;
private int nElems; public OrdArray(int max){
a = new long[max];
nElems = 0;
} public int size(){
return nElems;
} public int find(long searchKey){
int lowerBound = 0;
int upperBound = nElems-1;
int curIn;
while (true) {
curIn = (lowerBound + upperBound) / 2;
if (a[curIn] == searchKey) {//找到
return curIn;
} else if (lowerBound > upperBound){//没有找到
return nElems;
} else {
if (a[curIn] < searchKey) {
lowerBound = curIn+1;// it's in upper half
} else {
upperBound = curIn-1;// it's in lower half
}
}
}
} public void insert(long value){
int j;
for (j = 0;j<nElems;j++) {
if (a[j]>value) {
break;
}
} for (int k=nElems;k>j;k--) {
a[k] = a[k-1];
}
a[j] = value;
nElems++;
} //编程作业2.4
public void insert1(long value){ if (nElems == 0) { // 没有元素,直接插入
a[0] = value;
nElems++;
return;
} int lowerBound = 0;
int upperBound = nElems - 1;
int curIn; while (true) {
curIn = (lowerBound + upperBound) / 2;
if (lowerBound > upperBound) {
break;
}
if (a[curIn] == value) {
break;
} else if (a[curIn] < value) {
if (curIn == nElems - 1) {
curIn = curIn + 1;
break;
} else if (a[curIn + 1] >= value) {
curIn = curIn + 1;
break;
} else {
lowerBound = curIn + 1; // 注意这里是+1
} } else {
if (curIn == 0) {
break;
} else if (a[curIn - 1] <= value) {
break;
} else {
upperBound = curIn - 1; // 注意这里是-1;
}
} } for (int k = nElems; k > curIn; k--){
// move bigger ones up
a[k] = a[k - 1];
}
a[curIn] = value; // insert it
nElems++; // increment size
} public boolean delete(long value){
int j = find(value);
if (j == nElems) {
return false;
} else {
for (int k=j;k<nElems;k++) {
a[k] = a[k+1];
}
nElems--;
return true;
}
} public void display() // displays array contents
{
for (int j = 0; j < nElems; j++)
// for each element,
System.out.print(a[j] + " "); // display it
System.out.println("");
} //编程作业2.5
public OrdArray merge(OrdArray orderArr){
OrdArray dist = new OrdArray(this.nElems + orderArr.nElems);
int index = 0;
for (int i=0;i<orderArr.size();i++) {
dist.insert(orderArr.a[i]);
} for (int i = 0; i < this.size(); i++) {
dist.insert(this.a[i]);
} return dist;
} }
package chap2;

/**
* Created by admin on 2018/11/15.
*/
public class OrderedApp { public static void main(String[] args) {
int maxSize = 100; // array size
OrdArray arr; // reference to array
arr = new OrdArray(maxSize); // create the array
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); int searchKey = 55; // search for item
if (arr.find(searchKey) != arr.size())
System.out.println("Found " + searchKey);
else
System.out.println("Can't find " + searchKey); arr.display(); // display items arr.delete(00); // delete 3 items
arr.delete(55);
arr.delete(99); arr.display(); // display items again // ============================
// 编程作业2.4 p50(69)
arr = new OrdArray(maxSize); // create the array
arr.insert1(4); // insert 10 items
arr.insert1(3);
arr.insert1(2);
arr.insert1(1); arr.display(); // display items again // 编程作业2.5 p50(69)
System.out.println("第二个数组:");
OrdArray arr1 = new OrdArray(maxSize); // create the array
arr1.insert(10);
arr1.insert(20);
arr1.insert(30);
arr1.insert(40);
arr1.insert(50);
arr1.insert(60);
arr1.insert(70);
arr1.display();
System.out.println("合并两个数组,生成新的数组:");
OrdArray arr2 = arr.merge(arr1);
arr2.display();
// ============================
} // end main()
}

java数据结构和算法编程作业系列篇-数组的更多相关文章

  1. Java数据结构和算法(二):数组

    上篇博客我们简单介绍了数据结构和算法的概念,对此模糊很正常,后面会慢慢通过具体的实例来介绍.本篇博客我们介绍数据结构的鼻祖——数组,可以说数组几乎能表示一切的数据结构,在每一门编程语言中,数组都是重要 ...

  2. 【学习总结】java数据结构和算法-第三章-稀疏数组和队列

    相关链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 稀疏数组 队列 稀疏数组 稀疏数组介绍 图示 应用实例 代码实现 SparseArray.java:与二 ...

  3. 《Java数据结构与算法》笔记-CH2有序数组

    /** * 上个例子是无序数组,并且没有考虑重复元素的情况. * 下面来设计一个有序数组,我们设定不允许重复,这样提高查找的速度,但是降低了插入操作的速度. * 1.线性查找 * 2.二分查找 * 有 ...

  4. 《Java数据结构与算法》笔记-CH2无序数组

    /** * 本章目标: * 1.自制数组类 * 2.有序数组:按关键字升降序排列:二分法查找 * 3.分析有序数组.大O表示法 */ /** * 自制数组类 书中有的地方有错误,本程序以修改 */ c ...

  5. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

  6. java数据结构与算法之栈(Stack)设计与实现

    本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是一种用于 ...

  7. 《java数据结构与算法》系列之“开篇”

    大学的时候学习数据结构,当时吧虽然没挂这门课,但是确实学的不咋地,再但是其实自己一直都觉得数据结构很重要,是基础,只有基础好了,后面的路才能走的更好. 懒惰真的是天下的罪恶之源.所以一直到现在都毕业了 ...

  8. Java数据结构和算法 - 堆

    堆的介绍 Q: 什么是堆? A: 这里的“堆”是指一种特殊的二叉树,不要和Java.C/C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分 A: 堆是有如下特点的二叉 ...

  9. Java数据结构和算法 - 哈希表

    Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计 ...

随机推荐

  1. yum下载rpm包

    方法一:downloadonly插件 1.安装插件 yum -y install yum-download  2.下载httpd软件包到当前文件夹内 yum -y install httpd -dow ...

  2. spark Pair RDD 基础操作

    下面是Pair RDD的API讲解 转化操作 reduceByKey:合并具有相同键的值: groupByKey:对具有相同键的值进行分组: keys:返回一个仅包含键值的RDD: values:返回 ...

  3. 苹果审核被拒,Guideline 1.1.6 - Safety - Objectionable Content;Guideline 3.1.1 - Business - Payments - In-App Purchase

    Guideline 1.1.6 - Safety - Objectionable Content Thank you for your resubmission. We noticed that yo ...

  4. python摸爬滚打之day11----函数闭包,迭代器

    1.函数名 函数名就是一个变量名, 函数名存储的是该函数的内存地址.    函数名都可以进行哪些应用? 函数名可以赋值给其他的变量; 函数名可以作容器里的元素使用; 函数名可以当做形参传进另一函数; ...

  5. Appium环境配置(二)

    一.使用Eclipse直接创建案例工程 1.打开Eclipse,[File]-->[New]-->[Project] 2.选择[Java Project]-->[Next] 3.输入 ...

  6. AMI:加密的机器映像。卷

    (一)定义:镜像AMI (Amazon Machine Image,机器映像)是一个可以将操作系统.用户的应用程序.配置等一起打包的加密机器映像.用于启用实例的预配置服务器模板.每个 AMI 由一个操 ...

  7. 防止SQL注入的6个要点

    SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.防止SQL注入,我们可以从以下6个要点来进行: 1.永远不要信任用户的输入 ...

  8. 20170907VS中EF模型文件.edmx文件上下级关系丢失问题

    状态:A 电脑check in .edmx文件到TFS ,B 电脑vs下载如下文件 vs解决方案中此文件平级显示,原因:ADO.NET 数据模型创建的时候,会在工程文件 .csproj内增加文件层级关 ...

  9. UDP网络通信

    网络概念 一.目的 二.IP地址 三.端口 一.目的 目的 : 主要用于让两个用户端的服务器或者客户端,可以实现资源共享和信息传递 二.IP地址 1.作用 : 计算机网络中一台计算机的标识 2.种类 ...

  10. 009-ThreadPoolExecutor运转机制详解,线程池使用1-newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor、newScheduledThreadPool

    一.ThreadPoolExecutor理解 为什么要用线程池: 1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务. 2.可以根据系统的承受能力,调整线程池中工作线线程的数 ...