研磨数据结构与算法-01开山

实现一个简单是List集合:

public class MyArray {

//List本身底层就是一个数组,只是在这暂时定义成long类型

private long[] arr;

//表示有效数据的长度

private int elements;

//对象创建时为数组创建50长度

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 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];

}

}

/**

* 删除数据

*/

public void delete(int index) {

if(index >= elements || index < 0) {

//如果传入的索引下标值不对 抛出异常

throw new ArrayIndexOutOfBoundsException();

} else {

for(int i = index; i < elements; i++) {

//从需要删除的数据开始,由后往前依次覆盖

arr[index] = arr[index + 1];

}

elements--;

}

}

/**

* 更新数据

*/

public void change(int index, int newvalue) {

if(index >= elements || index < 0) {

//如果传入的索引下标值不对 抛出异常

throw new ArrayIndexOutOfBoundsException();

} else {

//更新数据

arr[index] = newvalue;

}

}

}

带排序:

public class MyOrderArray {

private long[] arr;

//表示有效数据的长度

private int elements;

public MyOrderArray() {

arr = new long[50];

}

public MyOrderArray(int maxsize) {

arr = new long[maxsize];

}

/**

* 添加数据

*/

public void insert(long value) {

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.println("]");

}

/**

* 查找数据

*/

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 {

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 {

for(int i = index; i < elements; i++) {

arr[index] = arr[index + 1];

}

elements--;

}

}

/**

* 更新数据

*/

public void change(int index, int newvalue) {

if(index >= elements || index < 0) {

throw new ArrayIndexOutOfBoundsException();

} else {

arr[index] = newvalue;

}

}

}

测试:

public class TestMyArray {

public static void main(String[] args) {

MyArray arr = new MyArray();

arr.insert(13);

arr.insert(34);

arr.insert(90);

arr.display();

System.out.println(arr.search(190));

System.out.println(arr.get(1));

arr.change(0, 12);

arr.display();

MyOrderArray arr = new MyOrderArray();

arr.insert(90);

arr.insert(30);

arr.insert(80);

arr.insert(10);

arr.display();

System.out.println(arr.binarySearch(30));

}

}

时间: 2024-08-13 13:07:49

研磨数据结构与算法-01开山的相关文章

【数据结构与算法01】数组

数组是应用最广泛的数据存储结构.它被植入到大部分的编程语言中,由于数组十分易懂,所以在这里就不赘述,主要附上两端代码,一个是普通的数组,另一个是有序数组.有序数组是按关键字升序(或降序)排列的,这种排列使快速查找数据项成为可能,即可以使用二分查找. 普通数组的Java代码: public class GeneralArray { private int[] a; private int size; //数组的大小 private int nElem; //数组中有多少项 public Gener

【数据结构与算法 01】冒泡排序

算法思想: 一共进行 array.size-1趟排序,每一趟排序,都将左右两个数进行比较大小,并且交换位置,这样的效果是:每一趟排序中,能找到最大的值冒泡到该趟排序的最后面,这样的话,第一趟排序,最后一个数是最大的,第二趟排序,倒数第二个数就是第二大的,最后一趟排序后 (因为最后一趟只有一个数,不用比较,所以比较次数是 array.size-1 趟),将得到有序数组 博客地址:http://blog.csdn.net/mkrcpp/article/details/39178213 import

研磨数据结构与算法-02双端链表与双向链表

Node节点: /* * 链结点,相当于是车厢 */ public class Node { //数据域 public long data; //指针域 public Node next; public Node previous; public Node(long value) { this.data = value; } /** * 显示方法 */ public void display() { System.out.print(data + " "); } } 双端链表: /*

研磨数据结构与算法-13删除二叉树节点

节点: /* * 二叉树节点 */ public class Node { //数据项 public long data; //数据项 public String sData; //左子节点 public Node leftChild; //右子节点 public Node rightChild; /** * 构造方法 * @param data */ public Node(long data,String sData) { this.data = data; this.sData = sDa

研磨数据结构与算法-14红黑树

红黑树: public class RBTree { private final Node NIL = new Node(null,null,null,Color.BLACK,-1); private Node root; public RBTree() { root = NIL; } public RBTree(Node  root) { this.root = root; } //插入节点 public void rbInsert(Node node) { Node previous = N

研磨数据结构与算法-11二叉树的基本操作

节点: /* * 二叉树节点 */ public class Node { //数据项 public long data; //数据项 public String sData; //左子节点 public Node leftChild; //右子节点 public Node rightChild; /** * 构造方法 * @param data */ public Node(long data,String sData) { this.data = data; this.sData = sDa

研磨数据结构与算法-02各种排序算法

一,冒泡排序法 public class BubbleSort { public static long[] sort(long[] arr){ long temp; for(int i=0;i<arr.length-1;i++){ for(int j=arr.length-1;j>i;j--){ if(arr[j]<arr[j-1]){ temp=arr[j]; arr[j] = arr[j-1]; arr[j-1]=temp; } } } return arr; } } 测试: pu

研磨数据结构与算法-12遍历二叉树

节点: /* * 二叉树节点 */ public class Node { //数据项 public long data; //数据项 public String sData; //左子节点 public Node leftChild; //右子节点 public Node rightChild; /** * 构造方法 * @param data */ public Node(long data,String sData) { this.data = data; this.sData = sDa

研磨数据结构与算法-03栈与队列

一,栈 public class MyStack { //底层实现是一个数组 private long[] arr; private int top; /** * 默认的构造方法 */ public MyStack() { arr = new long[10]; top = -1; } /** * 带参数构造方法,参数为数组初始化大小 */ public MyStack(int maxsize) { arr = new long[maxsize]; top = -1; } /** * 添加数据