算法和数据结构是程序的核心,有时候可能能够很方便的使用java等语言提供的类库,也能通过类库满足我们开发中遇到的绝大多数的需求,但是如果想加深计算机技能的深度,算法和数据结构是不可或缺的,因为计算机技术飞速发展,只有算法和数据结构这些本质的、思想性的东西不会改变,重复”造轮子”个人觉得是提高技能最好的途径。
有序数组:数组存储有序的元素 缺陷:暂不考虑重复数组元素的问题
说明:
这里不会自己设计一个数组,而是通过代理模式,代理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+1; 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位–》重置原数组最后一个元素值 ③:更新有序数组属性:非空元素个数等 注意:元素添加的时候已经保证元素的顺序,删除不影响原有的排列顺序
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) 思路:
①:检查设置的元素下表是否越界 ②:保证更新后的数组的有序:更新指定的元素–》排序
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()方法添加新元素时,会进行自动的有序插入,因此客户端插入元素顺序和数组存储的元素小标顺序并没有绝对的对应的关系,因此未提供正对索引的赋值或取值的操作方法
新闻热点
疑难解答