数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间,空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
数组
数组的基本使用
public class TestArray { public static void main(String[] args) { int[] arr1=new int[3];
int length = arr1.length; System.out.println("arr1's length: "+length);
int element0 = arr1[0]; System.out.println("element0: " + element0); for (int x : arr1) { System.out.println(x); }
arr1[0]=99; System.out.println("element0: " + arr1[0]); arr1[1] = 98; arr1[2] = 97;
for (int i=0;i<length;i++){ System.out.println("arr1 element" + i + ": " + arr1[i]); }
int[] arr2 = new int[] { 90, 80, 70, 60, 50 };
System.out.println("arr2 length: " + arr2.length); } }
|
数组元素的添加
import java.util.Arrays;
public class TestArray { public static void main(String[] args) { int[] arr = new int[] { 9, 8, 7 };
System.out.println(Arrays.toString(arr));
int dst = 6;
int[] newArr = new int[arr.length + 1];
for (int i = 0; i < arr.length; i++) { newArr[i] = arr[i]; }
newArr[arr.length] = dst;
arr = newArr;
System.out.println(Arrays.toString(arr)); } }
|
数组元素的删除

import java.util.Arrays;
public class TestArray { public static void main(String[] args) { int[] arr = new int[] { 9, 8, 7, 6, 5, 4 };
System.out.println(arr.length);
int dst = 2;
System.out.println(Arrays.toString(arr));
int[] newArr = new int[arr.length - 1];
for (int i = 0; i < newArr.length; i++) { if (i < dst) { newArr[i] = arr[i]; } else { newArr[i] = arr[i + 1]; } }
arr = newArr;
System.out.println(Arrays.toString(arr)); } }
|
面向对象的数组
import java.util.Arrays;
public class MyArray { private int[] elements;
public MyArray() { elements = new int[0]; }
public int size() { return elements.length; }
public void add(int element) { int[] newArr = new int[elements.length + 1]; for (int i = 0; i < elements.length; i++) { newArr[i] = elements[i]; } newArr[elements.length] = element; elements = newArr; }
public void show() { System.out.println(Arrays.toString(elements)); }
public void delete(int index) { if (index < 0 || index > elements.length - 1) { throw new RuntimeException("下标越界"); } int[] newArr = new int[elements.length - 1]; for (int i = 0; i < newArr.length; i++) { if (i < index) { newArr[i] = elements[i]; } else { newArr[i] = elements[i + 1]; } } elements = newArr; }
public int get(int index) { if (index < 0 || index > elements.length - 1) { throw new RuntimeException("下标越界"); } return elements[index]; }
public void insert(int index, int element) { int[] newArr = new int[elements.length + 1]; for (int i = 0; i < elements.length; i++) { if (i < index) { newArr[i] = elements[i]; } else { newArr[i + 1] = elements[i]; } } newArr[index] = element; elements = newArr; }
public void set(int index, int element) { if (index < 0 || index > elements.length - 1) { throw new RuntimeException("下标越界"); } elements[index] = element; }
public int search(int target) { for (int i = 0; i < elements.length; i++) { if (elements[i] == target) { return i; } } return -1; }
public int binarySearch(int target) { int begin = 0; int end = elements.length - 1; int mid = (begin + end) / 2; while (true) { if (begin >= end) { return -1; } if (elements[mid] == target) { return mid; } else { if (elements[mid] > target) { end = mid - 1; } else { begin = mid + 1; } mid = (begin + end) / 2; } } } }
|
public class TestArray { public static void main(String[] args) { MyArray ma = new MyArray(); int size = ma.size(); ma.show(); ma.add(99); ma.add(98); ma.add(97); ma.show(); ma.delete(1); ma.show(); int element = ma.get(1); System.out.println(element); ma.add(96); ma.add(95); ma.add(94); ma.show(); ma.insert(3, 93); ma.show(); ma.set(0, 100); ma.show(); System.out.println(ma.size()); } }
|
查找算法之线性查找
public class TestArray {
public static void main(String[] args) { int[] arr = new int[]{2, 3, 5, 6, 8, 4, 9, 0}; int target = 8; int index = -1; for (int i = 0; i < arr.length; i++) { if (arr[i] == target) { index = i; break; } } System.out.println("index:" + index); } }
|
查找算法之二分法查找
二分法查找(又叫分半查找、拆半查找)
前提条件:数组必须是一个有序的序列 可以是递增的 也可以是递减的
思想:要查找的数据x,每次与中间的位置的元素进行比较大小,来判断被查找的数据x,可能在 中间的左边 还是 右边