数组是应用最广泛的一种数据结构,常常被植入到编程语言中,作为基本数据类型使用,
因此,在一些教材中,数组并没有被当做一种数据结构单独拿出来讲解(其实数组就是一段连续的内存,即使在物理内存中不是连续的,在逻辑上肯定是连续的)。其实没必要在概念上做纠缠,数组可以当做学习数据结构的敲门砖,以此为基础,了解数据结构的基本概念以及构建方法
数据结构不仅是数据的容器,还要提供对数据的操作方法,比如检索、插入、删除、排序等
1 无序数组
下面我们建立一个类,对数组的检索、插入、删除、打印操作进行封装,简便起见,我们假设数组中没有重复值(实际上数组可以包含重复值)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| public class Array { private String [] strArray; private int length = 0; public Array(int max){ strArray = new String [max]; } public int contains(String target){ int index = -1; for(int i=0;i<length;i++){ if(strArray[i].equals(target)){ index = i; break; } } return index; } public void insert(String elem) { strArray[length] = elem; length++; } public boolean delete(String target){ int index = -1; if((index = contains(target)) !=-1){ for(int i=index;i<length-1;i++){ strArray[i] =strArray[i+1]; } length--; return true; }else{ return false; } } public void display(){ for(int i=0;i<length;i++){ System.out.print(strArray[i]+"\t"); } } }
|
无序数组的优点:插入快,如果知道下标,可以很快的存取
无序数组的缺点:查找慢,删除慢,大小固定。
2 有序数组
所谓的有序数组就是指数组中的元素是按一定规则排列的,其好处就是在根据元素值查找时可以是使用二分查找,查找效率要比无序数组高很多,在数据量很大时更加明显。当然缺点也显而易见,当插入一个元素时,首先要判断该元素应该插入的下标,然后对该下标之后的所有元素后移一位,才能进行插入,这无疑增加了很大的开销
因此,有序数组适用于查找频繁,而插入、删除操作较少的情况
有序数组的封装类如下,为了方便,我们依然假设数组中是没有重复值的,并且数据是按照由小到大的顺序排列的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| public class OrderArray { private int[] intArray; private int length = 0; public OrderArray(int max) { intArray = new int[max]; } public int find(int target) { int lowerBound = 0; int upperBound = length - 1; int curIn; if (upperBound < 0) { return -1; } while (true) { curIn = (lowerBound + upperBound) / 2; if (target == intArray[curIn]) { return curIn; } else if (curIn == lowerBound) { if (target == intArray[upperBound]) { return upperBound; } else { return -1; } } else { if (intArray[curIn] < target) { lowerBound = curIn; } else { upperBound = curIn; } } } } public void insert(int elem) { int location = 0; for (; location < length; location++) { if (intArray[location] > elem) break; } for (int i = length; i > location; i--) { intArray[i] = intArray[i - 1]; } intArray[location] = elem; length++; } public boolean delete(int target) { int index = -1; if ((index = find(target)) != -1) { for (int i = index; i < length - 1; i++) { intArray[i] = intArray[i + 1]; } length--; return true; } else { return false; } } public void display() { for (int i = 0; i < length; i++) { System.out.print(intArray[i] + "\t"); } System.out.println(); } public static void main(String[] args) { OrderArray orderArray = new OrderArray(4); orderArray.insert(3); orderArray.insert(4); orderArray.insert(6); orderArray.insert(8); int i = orderArray.find(8); System.out.println("在队列中的位置是" + i); } }
|
有序数组最大的优势就是可以提高查找元素的效率,在上例中,find方法使用了二分查找法
有序数组的优点:查找效率高
有序数组的缺点:删除和插入慢,大小固定