数据结构 - - - - - - 数组

这篇博客探讨了数组这一数据结构,重点介绍了如何进行顺序插入和二分插入的方法,通过示例代码进行了详细解释。
摘要由CSDN通过智能技术生成
今天是2019-5-7.从现在开始的话,我会发一些源码的一些解刨,里面的那些内容讲解全部都写在代码里面,是以初学者的角度写的,因为我自身就是一个初学者。这些东西的话,我是准备放到博客里,让我自己以后再来进行参考学习的,算是我记忆的一部分吧!(这些放上来的代码中,有或多或少的代码是重复的,自己综合性的看吧!)

数组的一些简单操作

package ch01;

public class MyArray {
	/**
	 * 上一个/下一个光标的位置:Alt+Left/Right 
	 * 选中闭合元素:Alt+Shift+Up/Down/Left/Right 
	 * 上一个/下一个成员(成员对象或成员函数):Ctrl+Shift+Up/Down
	 * 删除行:Ctrl+D 
	 * 在当前行上插入一行:Ctrl+Shift+Enter
	 * 在当前行下插入一行: Shift+Enter 
	 * 上下移动选中的行:Alt+Up/Down
	 */
	private long[] arr;
	//表示有效的数据长度
	private int elements;
	
	public MyArray() {
		// TODO Auto-generated constructor stub
		arr = new long[50];
	}
	public MyArray(int maxsize) {
		// TODO Auto-generated constructor stub
		arr = new long[maxsize];
	}
	/**
	 * 添加数据
	 */
	public void insert(long value){
		arr[elements] = value;
		elements++;
	}
	//显示数据
	public void display(){
		System.out.print("[");
		for(int i=0; i<elements; i++){
			System.out.print(arr[i]+ " ");
		}
		System.out.print("]");
	}
	/**
	 * 根据值查找数据,如果数据存在返回下标
	 */
	public int search(long value){
		int i;
		for(i=0; i<elements; i++){
			if (value==arr[i]) {
				break;
			}
		}
		
		if (i== elements) {
			return -1;
		}else{
			return i;
		}
	}
	/**
	 * 根据索引查找数据,返回值
	 */
	 public long get(int index){
		if (index>=elements || index<0) {
			 throw new ArrayIndexOutOfBoundsException();
		}else{
			return arr[index];
		}
	 }
	 
	 	/**
		 * 根据index下标删除数据,后一个值覆盖前一个值,这样就删除掉了 
		 */
		 public void delete(int index){
			if (index>=elements || index<0) {
				 throw new ArrayIndexOutOfBoundsException();
			}else{
				for(int i=0; i<elements;i++){
					arr[index] = arr[index+1];
				}
				elements--;
			}
		 }
		 /**
		  * 更新数据
		  */
		 public void update(int index,long value){
				if (index>=elements || index<0) {
					 throw new ArrayIndexOutOfBoundsException();
				}else{
					arr[index] = value;
				}
			 }
}

下面这个示例:里面多了一个顺序插入和二分插入法

package ch01;

public class MyOrderArray {
	/**
	 * 上一个/下一个光标的位置:Alt+Left/Right 
	 * 选中闭合元素:Alt+Shift+Up/Down/Left/Right 
	 * 上一个/下一个成员(成员对象或成员函数):Ctrl+Shift+Up/Down
	 * 删除行:Ctrl+D 
	 * 在当前行上插入一行:Ctrl+Shift+Enter
	 * 在当前行下插入一行: Shift+Enter 
	 * 上下移动选中的行:Alt+Up/Down
	 */
	private long[] arr;
	//表示有效的数据长度
	private int elements;
	
	public MyOrderArray() {
		// TODO Auto-generated constructor stub
		arr = new long[50];
	}
	public MyOrderArray(int maxsize) {
		// TODO Auto-generated constructor stub
		arr = new long[maxsize];
	}
	/**
	 * 顺序添加数据
	 */
	public void insert(long value){
		/*arr[elements] = value;
		elements++;*/
		int i;
		for (i = 0; i < elements; i++) {
			if (arr[i] > value) {
				break;
			}
		}
		
		for(int j =elements; j>i; j--){
			arr[j] = arr[j-1];
		}
		arr[i] = value;
		elements++;
	}
	//显示数据
	public void display(){
		System.out.print("[");
		for(int i=0; i<elements; i++){
			System.out.print(arr[i]+ " ");
		}
		System.out.print("]");
	}
	/**
	 * 根据值查找数据,如果数据存在返回下标
	 */
	public int search(long value){
		int i;
		for(i=0; i<elements; i++){
			if (value==arr[i]) {
				break;
			}
		}
		
		if (i== elements) {
			return -1;
		}else{
			return i;
		}
	}
	/**
	 * 二分法查找数据,返回查找查找值的下标
	 */
	public int binarySearch(long value){
		int middle =0;//中间下标
		int low =0;//初始最左边下标
		int pow = elements;//数组有效数据最右边下标
		while (true) {
			middle= (pow + low)/2;
			if (arr[middle] ==value) {
				return middle;
			}else if (low>pow) {//如果查找的数据不存在且一直小,pow只会一直变小;如果查找的数据不存在且一直大,low只会一直变大。所以最后结果只会是low>pow
				return -1;
			}else {
				if (arr[middle] > value) {//要查找的值,如果比中间值小的话,右边下标pow则变成middle-1.反之
					pow = middle -1;
				}else{
					low = middle +1;
				}
			}
		}
	}
	/**
	 * 根据索引查找数据,返回值
	 */
	 public long get(int index){
		if (index>=elements || index<0) {
			 throw new ArrayIndexOutOfBoundsException();
		}else{
			return arr[index];
		}
	 }
	 
	 	/**
		 * 根据index下标删除数据,后一个值覆盖前一个值,这样就删除掉了 
		 */
		 public void delete(int index){
			if (index>=elements || index<0) {
				 throw new ArrayIndexOutOfBoundsException();
			}else{
				for(int i=0; i<elements;i++){
					arr[index] = arr[index+1];
				}
				elements--;
			}
		 }
		 /**
		  * 更新数据
		  */
		 public void update(int index,long value){
				if (index>=elements || index<0) {
					 throw new ArrayIndexOutOfBoundsException();
				}else{
					arr[index] = value;
				}
			 }
}

测试类

package ch01;

import javax.xml.ws.soap.MTOM;

public class TestMyArray {
	public static void main(String[] args) {
		/*MyArray myArray = new MyArray();
		myArray.insert(11);
		myArray.insert(12);
		myArray.insert(13);
		myArray.display();
		System.out.println(myArray.search(12));
		
		
		System.out.println(myArray.get(1));
		
		myArray.delete(1);
		myArray.display();
		
		myArray.update(0, 99);
		myArray.display();*/
		
		
		MyOrderArray myArray = new MyOrderArray();
		myArray.insert(15);
		myArray.insert(14);
		myArray.insert(5);
		myArray.insert(13);
		myArray.insert(2);
		myArray.insert(8);
		myArray.display();
		
		
		System.out.println(myArray.binarySearch(5));
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值