【数组】 - 有序数组设计

有序数组:数组存储有序的元素

不足:暂不考虑重复数组元素的问题

思路:通过代理模式,代理Java已实现的数组对象,实现有序数组的功能

有序数组结构主体


package com.zhiwei.array;

public class OrderArray {

	private int[] orderArray;
	private int nElems;  //非空元素个数
	private int initSize; //数组最大容纳元素个数
	
	public OrderArray(int initSize){
		this.orderArray = new int[initSize];
		this.nElems = 0;
		this.initSize = initSize;
	}
}

添加新元素:addElem(int value)


①:数组已经初始化其内存空间是不能发生改变的,因此数组添加新元素的时候需要考虑数组的存储空间是否有限的问题 ②:新元素有序插入:确定新元素位置--> 原数组受影响元素向后移动1位--> 存放新元素 ③:更新数组的属性信息:非空元素个数等

public boolean addElem(int value){
		
		if(nElems>=initSize){ 
			return false;
		}
		
		int index = 0; 
		for(int i=0;i<nElems;i++){
			if (value < orderArray[i]){
				index = i;  
				break;
			}
		}
		//最后一个非空元素开始后移1位
		for(int j=nElems-1;j>=index;j--){
			orderArray[j+1] = orderArray[j];
		}
		orderArray[index] = value;
		nElems++;
		return true;
	}

删除元素:delElem(int value)


  1. 检查原数组是否包含指定值的元素,如果不存在则不处理
  2. 有序数组删除元素:确定目标元素位置--> 受影响元素前移动1位--》重置原数组最后一个元素值
  3. 更新有序数组属性:非空元素个数等 注意:元素添加的时候已经保证元素的顺序,删除不影响原有的排列顺序
public  boolean delElem(int value){
		
		boolean flag = false;
		int index = 0;
		for(int i=0;i<nElems;i++){ 
			if(value == orderArray[i]){
				index = i;
				flag = true;
				break;
			}
		}
		
		if(!flag)  
			return false;
				
		for(int i=index;i<nElems-1;i++){  
			orderArray[i] = orderArray[i+1];
		}
		orderArray[nElems-1] = 0;  
		nElems--;
		return true;
	}

更新元素:updateElem(int index,int value)


  1. 检查设置的元素下表是否越界
  2. 保证更新后的数组的有序:更新指定的元素->排序
public boolean updateElem(int index,int value){
		
		if(index>=nElems) 
			return false;
		
			orderArray[index] = value;
			sortArray(); //重新排序:这里采用冒泡法
			return true;
	}

冒泡排序法


思想:每次排序都将最大或者最小的元素筛选出来放在最后,然后一次对剩下的元素进行最值筛选,最后形成有序的序列 sortArray()方法:

public void sortArray(){
		for(int i=0;i<nElems;i++){
			for(int j=0;j<nElems-i-1;j++){
				if(orderArray[j]>orderArray[j+1]){
					int temp = orderArray[j];
					orderArray[j] = orderArray[j+1];
					orderArray[j+1] = temp;
				}
			}
		}
	}

数组遍历展示:show()

public void show(){
		StringBuffer sb = new StringBuffer();
		sb.append("数组元素:[");
		for(int i=0;i<nElems;i++){
			sb.append(orderArray[i]+",");
		}
		sb.deleteCharAt(sb.length()-1).append("]");
		System.out.println(sb);
	}

返回数组长度:length()


public int length(){
		return nElems;
	}

测试代码


OrderArray orderArray = new OrderArray(10);  		
		   orderArray.addElem(10);
		   orderArray.addElem(8);
		   orderArray.addElem(9);
		   orderArray.addElem(5);
		   orderArray.addElem(8);
		   orderArray.addElem(7);
		   
		   orderArray.show();
		   
		   orderArray.delElem(11);
		   orderArray.show();
		   
		   orderArray.delElem(8);
		   orderArray.delElem(9);
		   orderArray.show();
		   
		   orderArray.updateElem(3,6);
		   orderArray.show();
		   
		   System.out.println(orderArray.length());

结果:
这里写图片描述

补充说明:

因为是有序数组,通过addElem()方法添加新元素时,元素自动排序插入,因此插入元素顺序和数组存储的元素下标顺序并没有绝对的对应的关系,因此未提供正对索引的赋值或取值的操作方法

转载于:https://my.oschina.net/yangzhiwei256/blog/3008636

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值