目录
一、数据结构
1.数据与数据之间的逻辑关系:维合、一对一、一对多、多对多
2.数据的存储结构:
线性表:顺序表(比如:数组)、链表、栈、队列
树形结构:二叉树
图形结构:
二、数组中涉及的常见算法
1.数组元素的赋值(杨辉三角、回形数等)
2.求数值型数组中元素的最大值、最小值、平均数、总和等
3.数组的复制、反转、查找(线性查找、二分法查找)
4.数组元素的排序算法
(1)杨辉三角
(2) 求数值型数组中元素的最大值、最小值、平均数、总和等
**
* @Description:算法的考查:求数值型数组中元素的最大值、最小值、平均数、总和等
* 定义一个int型的一维数组,包含1日个元素,分别赋一些随机整数,
* 然后求出所有元素的最大值,最小值,和值,平均值,并输出出来。
* 要求:所有随机数都是两位数。 $
* @Author: dyq
* @Date: $
*/
public class Test05 {
public static void main(String[] args) {
int[] arr = new int[10];
for (int i =0;i<arr.length;i++){
arr[i]= (int)(Math.random()*(99-10+1)+10);
}
//遍历
for (int i =0;i<arr.length;i++){
System.out.println(arr[i]);
}
//求数组元素的最大值
int max =arr[0];
for (int i=0;i< arr.length;i++){
if(max<arr[i]){
max=arr[i];
}
}
System.out.println("最大值为:"+max);
//求最小值
int min =arr[0];
for (int i=0;i< arr.length;i++){
if(min>arr[i]){
min=arr[i];
}
}
System.out.println("最小值为:"+min);
//求和
int sum =0;
for (int i =0;i<arr.length;i++){
sum+=arr[i];
}
System.out.println("总和为:"+sum);
//数组元素的平均数
double avg = sum/arr.length;
System.out.println("平均值为:"+avg);
}
}
(3).数组的复制、反转、查找(线性查找、二分法查找)
a、数组的复制
数组的赋值:
public class Test06 {
public static void main(String[] args) {
int[] arry1,arry2;
arry1 = new int[]{2,3,5,7,11,13,17,19};
//显示arry1的内容
System.out.print("第一次输出arry1:");
for (int i=0;i<arry1.length;i++){
System.out.print(arry1[i]+"\t");
}
//赋值arry2变量arry1 不能称作数组的复制
arry2=arry1; //array1和array2地址值相同,都指向了堆空间的唯一的一个数组实体。
//修改arry2中的偶数索引元素,使其等于索引值(如array[0]=0,array[2]=2)。打印出array1。
for (int i=0;i<arry2.length;i++){
if(i % 2==0){
arry2[i]=i;
}
}
System.out.print("第二次输出arry1:");
for (int i=0;i<arry1.length;i++){
System.out.print(arry1[i]+"\t");
}
}
}
输出结果:
第一次输出arry1:2 3 5 7 11 13 17 19
第二次输出arry1:0 3 2 7 4 13 6 19
数组的复制:
public class Test07 {
public static void main(String[] args) {
int[] arry1,arry2;
arry1 = new int[]{2,3,5,7,11,13,17,19};
//显示arry1的内容
System.out.print("第一次输出arry1:");
for (int i=0;i<arry1.length;i++){
System.out.print(arry1[i]+"\t");
}
//数组的复制
arry2 = new int[arry1.length];
for (int i =0;i<arry2.length;i++){
arry2[i]=arry1[i];
}
//修改arry2中的偶数索引元素,使其等于索引值(如array[0]=0,array[2]=2)。打印出array1。
for (int i=0;i<arry2.length;i++){
if(i % 2==0){
arry2[i]=i;
}
}
System.out.print("第二次输出arry1:");
for (int i=0;i<arry1.length;i++){
System.out.print(arry1[i]+"\t");
}
}
}
第一次输出arry1:2 3 5 7 11 13 17 19
第二次输出arry1:2 3 5 7 11 13 17 19
数组的反转,查找
public class Test08 {
public static void main(String[] args) {
String[] arr = new String[]{"哥哥", "姐姐", "弟弟", "妹妹", "爸爸", "妈妈"};
//数组的复制
String[] arr1 = new String[arr.length];
for (int i = 0; i < arr1.length; i++) {
arr1[i] = arr[i];
}
//数组的反转
//方式一
// for (int i =0 ;i<arr.length/2;i++){
// String temp = arr[i];
// arr[i] = arr[arr.length-i-1];
// arr[arr.length-i-1]= temp;
// }
//方法二
for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
String temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//遍历
System.out.println("反转数组:");
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i] + "\t");
}
//查找(或收索)
//线性查找
String dest = "姐姐";
boolean isFlag = true;
System.out.println("查找元素:");
for (int i = 0; i < arr.length; i++) {
if (dest.equals(arr[i])) {
System.out.println("找到指定元素" + dest + ",位置为:" + i);
isFlag = false;
break;
}
}
if (isFlag) {
System.out.println("很遗憾没有找到!");
}
//二分法查找 前提:所要查找的数组必须有序。
int[] arr2 = new int[]{ -99,-89,-1,12, 23, 44,45,66,67,98,100};
int dest1 =-99;
int head = 0;//初始的首索引
int end = arr2.length - 1;//初始的末索引
boolean isFlag1 = true;
while (head <= end) {
int middle = (head + end) / 2;
if (dest1 == arr2[middle]) {
System.out.println("找到了指定的元素,位置为:" + middle);
isFlag1 = false;
break;
} else if (arr2[middle] > dest1) {
end = middle- 1;
} else {//arr2[middle]<dest1
head = middle + 1;
}
}
if (isFlag1) {
System.out.println("很遗憾没有找到!");
}
}
}
结果:
反转数组:
妈妈
爸爸
妹妹
弟弟
姐姐
哥哥
查找元素:
找到指定元素姐姐,位置为:4
找到了指定的元素,位置为:0
(4)、数组元素的排序算法
算法的五大特征:
说明:满足确定性的算法也称为:确定性算法。现在人们也关注更广泛的概念,例如考虑各种非确定性的算法,如并行算法、概率算法等。另外,人们也关注并不要求终止的计算描述,这种描述有时被称为过程( procedure ) 。
冒泡排序
public class BubbleSortTest {
public static void main(String[] args) {
int[] arry = new int[]{43,32,21,4,56,77,89,900};
//冒泡排序
for (int i =0;i<arry.length-1;i++){
for (int j =0;j<arry.length-1-i ; j++){
if (arry[j]>arry[j+1]){
int temp = arry[j];
arry[j] = arry[j+1];
arry[j+1] = temp;
}
}
}
for (int i =0;i<arry.length;i++){
System.out.println("冒泡排序:"+arry[i]+"\t");
}
}
}
结果:
4
21
32
43
56
77
89
900
快速排序
public class QuickSort {
private static void swap(int[] data, int i, int j) {
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
private static void subSort(int[] data, int start, int end) {
if (start < end) {
int base = data[start];
int low = start;
int high = end + 1;
while (true) {
while (low < end && data[++low] - base <= 0) ;
while (high > start && data[--high] - base >= 0) ;
if (low < high) {
swap(data, low, high);
} else {
break;
}
}
swap(data, start, high);
subSort(data, start, high - 1);//递归调用
subSort(data, high + 1, end);
}
}
public static void quickSort(int[] data){
subSort(data,0,data.length-1);
}
public static void main(String[] args) {
int[] data = { 9, -16, 30, 23, -30, -49, 25, 21, 30 };
System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
quickSort(data);
System.out.println("排序之后:\n" + java.util.Arrays.toString(data));
}
}
结果:
排序之前:
[9, -16, 30, 23, -30, -49, 25, 21, 30]
排序之后:
[-49, -30, -16, 9, 21, 23, 25, 30, 30]
各种内部排序方法性能比较
三、Arrays工具类的使用
代码实例:
import java.util.Arrays;
/**
* @Description: $
* @Author: dyq
* @Date: $
*/
public class ArraysTest {
public static void main(String[] args) {
int[] arr1 = new int[]{1,2,3,4};
int[] arr2 = new int[]{1,3,2,4};
//1 boolean equals(int[] a,int[] b) 判断两个数组是否相等。
boolean equals = arr1.equals(arr2);
System.out.println(equals);
//2 String toString(int[] a) 输出数组信息。
System.out.println(Arrays.toString(arr1));
//3 void fill(int[] a,int val) 将指定值填充到数组之中。
Arrays.fill(arr1,10);
System.out.println(Arrays.toString(arr1));
//4 void sort(int[] a) 对数组进行排序。
Arrays.sort(arr2);
System.out.println(Arrays.toString(arr2));
//5 int binarySearch(int[] a,int key) 对排序后的数组进行二分法检索指定的值。
int[] arry1 = new int[]{2,3,5,8,11,13,17,19};
int a = Arrays.binarySearch(arry1,19);
System.out.println(a);
}
}
结果:
false
[1, 2, 3, 4]
[10, 10, 10, 10]
[1, 2, 3, 4]
7
四、数组使用中的常见异常
public class ArrayException {
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4};
// for (int i=0;i <=arr.length;i++){
// System.out.print(arr[i]+"\t"); //报异常ArrayIndexOutOfBoundsException数组角标越界异常
// }
// System.out.println(arr[-1]);//报异常ArrayIndexOutOfBoundsException数组角标越界异常
//空指针异常java.lang.NullPointerException
//情况一:
// int[] arr1 = new int[]{1,2,3,4,5};
// arr1= null;
// System.out.println(arr1[0]);
//情况二:
// int[][] arr2 =new int[4][];
// System.out.println(arr2[0]); //null
//情况三:
String[] arr3 = new String[]{"AA","BB","CC"};
arr3[0]=null;
System.out.println(arr3[0].toString());
}
}