乒乓世界杯_u20世界杯最新战况 - chhtzx.com

Java数据结构与算法笔记——无序数组和有序数组

7940

文章目录

无序数组和有序数组比较无序数组特点

有序数组特点

代码实现自己的数组无序数组有序数组

无序数组和有序数组比较

无序数组

增:在数组最后插入 删:找到元素;改为null;后面的元素逐一前移 查:从第一项元素开始遍历,直至找到该元素或者遍历结束

特点

效率:插入数据快,查找数据慢,删除数据慢 扩展性差:一旦创建后,大小就固定了,不能动态扩展数组元素的个数,有可能造成空间浪费或者空间不足。

有序数组

插入:找到插入元素应该插入的位置(根据元素值的大小);将该位置以及以后的全部数据项向后移动一位;在该位置插入元素 删除:找到要删除的元素;后面的所有元素向前移位 查找:遍历查找or二分查找

特点

效率:插入数据慢,查找数据快(二分查找),删除数据慢。 扩展性差:一旦创建后,大小就固定了,不能动态扩展数组元素的个数,有可能造成空间浪费或者空间不足。

代码实现自己的数组

无序数组

package demo;

public class unorderedArray {

//程序的执行入口

public static void main(String[] args){

ArrayClass arrayClass = new ArrayClass(100);

//新增元素

arrayClass.insert(11);

arrayClass.insert(23);

arrayClass.insert(45);

arrayClass.insert(21);

arrayClass.insert(66);

arrayClass.insert(77);

arrayClass.insert(66);

//显示新增的数据

arrayClass.display();

//删除数据77

arrayClass.delete(23);

//显示新增的数据

arrayClass.display();

//查找

System.out.println(arrayClass.find(11));

System.out.println(arrayClass.find(1));

//修改

arrayClass.modifyFirst(66,77);

//显示新增的数据

arrayClass.display();

//修改

arrayClass.modifyAll(77,100);

//显示新增的数据

arrayClass.display();

}

}

/**

* 创建一个封装数组的类

*/

class ArrayClass{

private long[] arr; //被封装的数组

private int nElems; //数组中存在的元素的个数,当前的数组长度

//通过类的构造方法初始化

public ArrayClass(int maxSize){ //数组的最大长度

arr = new long[maxSize]; //初始化被封装的数组

nElems = 0;

}

//新增数据项,数组元素

public void insert(long data){

arr[nElems] = data;

nElems ++;

}

//查找某一特定的数据项

//找到返回true,否则返回false

public boolean find(long searchData){

int i;

for (i=0;i

if(searchData == arr[i]){

break;//找到了就直接终止循环,此时i不再++,就等于对应元素的索引值

}

}

if(i == nElems){

return false;

}

else{

return true;

}

}

//删除指定的数据项

public void delete(long targetDate){

//首先找到要删除的数据

int i;

for (i=0;i

if(targetDate == arr[i]){

break;//找到了就直接终止循环,此时i不再++,就等于对应元素的索引值

}

}

if(i == nElems){

System.out.println("没有找到要删除的数据");

}

else{

for(int j =i;j

arr[j] = arr[j+1]; //删除数组中要删除的元素

}

nElems --; //数组长度-1

}

}

//遍历数据结构中的各个数据项

public void display(){

for(int i=0;i

System.out.print(arr[i] + " ");

}

System.out.println();//加一个换行符

}

/**

* 以下内容是自己加的

*/

//修改数组内容(全部相同内容都改)

public void modifyAll(long originalData, long targetData){

for(int i=0;i

if(arr[i]==originalData){

arr[i] = targetData;

}

}

}

//修改数组内容(全部相同内容都改)

public void modifyFirst(long originalData, long targetData){

for(int i=0;i

if(arr[i]==originalData){

arr[i] = targetData;

break;

}

}

}

}

有序数组

package demo;

public class OrderedArray {

//程序的执行入口

public static void main(String[] args){

OrderArray orderArray = new OrderArray(100);

orderArray.insert(15);

orderArray.insert(44);

orderArray.insert(55);

orderArray.insert(22);

orderArray.insert(1);

orderArray.insert(99);

orderArray.display();

System.out.println(orderArray.find(55));

orderArray.delete(22);

orderArray.display();

}

}

/**

*封装有序数组

*/

class OrderArray{

private long[] arr;

private int nElems;

//构造方法

public OrderArray(int maxSize){

arr = new long[maxSize];

nElems =0;

}

//插入新的数据项

public void insert(long data){

//找到插入数据的位置

int i;

for(i=0;i

if(arr[i]> data){

break;

}

}

//判断找没找到

if(i

for(int j=nElems;j>i;j--){

if(j

arr[j]=arr[j-1];

}

}

arr[i] = data;

nElems ++;

}

else{//没找到,,要插入的元素比数组中其他元素都大

if(nElems

arr[nElems] = data;

nElems ++;

}

}

}

//遍历数组

public void display(){

for(int i=0;i

System.out.print(arr[i]+" ");

}

System.out.println();

}

//查找(二分查找)

//找到了就返回数组在数组中的索引值,没找到就返回数组的当前长度

public int find(long searchData){

int lowerBound = 0;

int upperBound = nElems-1;

int curint; // 对数组进行二分的时候,中间元素对应的索引值

while(true){

curint = (lowerBound + upperBound) / 2; //自动取整

if(arr[curint] == searchData){

return curint; //return不仅会结束while循环,还会结束find方法

}else if(lowerBound>upperBound) {

//数组中没有要查找的元素

return nElems;

}else{

if(arr[curint] > searchData){

upperBound = curint-1;

}else{

lowerBound = curint+1;

}

}

}

}

//删除指定元素

public void delete(long data){

int i = find(data);

if(i

for(int j = i;j

arr[j] = arr[j+1];

}

nElems --;

}

}

}