前言
想搞算法题,还是需要精通数据底层结构. 使用java语言封装简单的数组类.
package ch01;
public class MyArray {
private long[] arr;
//表示有效数据的长度
private int elements;
public MyArray() {
arr = new long[50];
}
public MyArray(int maxsize) {
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.println("]");
}
/**
* 添加数据并使添加的数组有序
*/
public void insertInSort(long value) {
int i;
//新插入的值与现有值逐个比较,找到自己的位置i
for (i = 0; i < elements; i++) {
if (arr[i] > value) {
break;
}
}
//i位置之后的元素往后挪,包括i也要挪开,不挪开新来的咋坐下
for (int j = elements; j > i; j--) {
arr[j] = arr[j - 1];
}
//挪完之后新来的在i位置坐下
arr[i] = value;
//队伍长度+1
elements++;
}
/**
* 查找数据获得该数据的索引
*/
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) {//若左指针比右指针大了,跳出循环,查询完毕了
return -1;
} else {
//若中间值比要查找的值大,则要查的值在中间的左边;
//所以要把右指针挪到中间的位置-1处
//若中间值比要查找的值小,则要查的值在中间的右边;
//所以要将左指针往右移
if (arr[middle] > value) {
pow = middle - 1;
} else {
low = middle + 1;
}
}
}
}
/**
* 查找数据,根据索引来查
*/
public long get(int index) {
if(index >= elements || index < 0) {
throw new ArrayIndexOutOfBoundsException();
} else {
return arr[index];
}
}
/**
* 删除数据
*/
public void delete(int index) {
if(index >= elements || index < 0) {
throw new ArrayIndexOutOfBoundsException();
} else {
//此处修正, 循环体内应是i;删除一个数,后面的数往前移一位
for(int i = index; i < elements; i++) {
arr[i] = arr[i + 1];
}
elements--;
}
}
/**
* 更新数据
*/
public void change(int index, int newvalue) {
if(index >= elements || index < 0) {
throw new ArrayIndexOutOfBoundsException();
} else {
arr[index] = newvalue;
}
}
}