数组简单基本算法
1.数组的创建与元素赋值(了解即可面试可能会有)
杨辉 三角(二维数组)、回形数(二位数组)、6个数,1-30之间随机生成且不重复
2.针对于数值型的数组
最大值、最小值、总和、平均数等
/*求数值型数组中 元素的最大值、最小值、平均数、总和等
定义一个int型的一维数组,包含10个元素,分别赋一些随机整数
然后求出所有元素最大值、最小值、平均值、总和,并输出出来
要求,所有随机数都是两位数
[10,99]
公式:(int)(Math.random() * (99 - 10 + 1) + 10)
*/
public class ArrayTest1{
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.print(arr[i] + "\t");
}
System.out.println();
//求数组元素的最大值
int maxValue = arr[0];
for(int i = 1;i < arr.length;i++){
if(maxValue < arr[i]){
maxValue = arr[i];
}
}
System.out.println("最大值为:" + maxValue);
//求数组元素的最小值
int minValue = arr[0];
for(int i = 1;i < arr.length;i++){
if(minValue > arr[i]){
minValue = arr[i];
}
}
System.out.println("最小值为:" + minValue);
//求数组元素总和
int sum = 0;
for(int i = 0;i < arr.length;i++){
sum += arr[i];
}
System.out.println("总和为:" + sum);
//求数组元素的平均数
int avgValue = sum / arr.length;
System.out.println("平均数为:" + avgValue);
}
}
3.数组的赋值与复制
int[] array1,array2;
array1 = new int[]{1,2,3,4};
package sgg;
/*使用简单数组
* 创建一个名为ArrayExer2的类,在 main()方法中声明array1和array2两个变量,他们是int[]典型的数组
* 使用大括号{},把array1初始化为八个素数:2,3,5,7,11,13,17,19
* 显示array1的内容
* 赋值array2变量等于array1,修改array2中的偶索引元素,使其等于索引值(如array[0] = 0,array[2] = 2),打印出array1,
* 思考array1和array2是什么关系?
array1和array2地址值相同,指向了堆空间的唯一的一个数组实体。
* 拓展,修改题目,实现array2对array1数组的复制
* */
public class sgg{
public static void main(String[] args) {
int[] array1,array2;
array1 = new int[] {2,3,5,7,11,13,17,19};
//显示array1的内容
for(int i = 0;i < array1.length;i++) {
System.out.print(array1[i] + "\t");
}
//赋值array2变量等于array1
//不能称数组的赋值
//array2 = array1;
//数组的复制:
array2 = new int[array1.length];
for(int i = 0;i < array2.length;i++){
array2[i] = array1[i];
}
//修改array2中的偶索引元素,使其等于索引值(如array[0] = 0,array[2] = 2)
for(int i = 0;i < array2.length;i++) {
if(i % 2 == 0) {
array2[i] = i;
}
}
System.out.println();
//打印出 array1
for(int i = 0;i < array1.length;i++) {
System.out.print(array1[i] + "\t");
}
}
}
赋值:
array2 = array1;
如何理解:将array1保存的数组的地址值赋值给了array2,使得array1和array2共同指向堆空间中的同一个数组实体。
复制:
array2 = new int[array1.length];
for(int i = 0;i < array2.length;i++){
array2[i] = array1[i];
}
如何理解:我们通过new的方式,给array2在堆空间中新开辟了数组的空间,将array1数组中的元素值一个个的赋值到array2数组中。
4.数组元素的反转
package sgg;
/*数组的复制、反转、查找(线性查找、二分法查找) */
public class sgg{
public static void main(String[] args) {
String[] arr = new String[] {"JJ","DD","MM","BB","GG","AA"};
String[] arr1 = new String[arr.length];
//数组的复制(区别于数组变量的赋值:arr1=arr)
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;
}
//遍历
for(int i = 0;i < arr.length;i++)
{
System.out.print(arr[i] + "\t");
}
}
}
5.数组中指定元素的查找:搜索、检索
线性查找:通过遍历的方式,一个一个的数据进行比较、查找、
适用性:具有普遍适用性。
二分法查找:
package sgg;
/*数组的复制、反转、查找(线性查找、二分法查找) */
public class sgg{
public static void main(String[] args) {
String[] arr = new String[] {"JJ","DD","MM","BB","GG","AA"};
String[] arr1 = new String[arr.length];
//二分法查找
//前提,所查找的数组必须有序
int[] arr2 = new int[]{-98,-33,2,33,55,66,77,88,111,129,444};
int dest1 = -33;
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("很遗憾没有找到啊");
}
}
}
实现思路:每次比较中间值,折半的方式检索。
适用性:(前提:数组必须有序)
6.数组的排序算法
十大内部排序算法:
选择排序:直接选择排序、堆排序
交换排序:冒泡排序、快速排序
插入排序:直接插入排序、折半插入排序、shell排序
归并排序
桶式排序
基数排序
理解:
1、衡量排序算法的优劣:
时间复杂度、空间复杂度、稳定性
2、排序的分类:
内部排序与外部排序(需要借助助手磁盘)
3、不同排序算法的时间复杂度
4、手写冒泡排序:
package sgg;
/*数组的冒泡排序实现) */
public class sgg{
public static void main(String[] args) {
int[] arr = new int[]{43,32,76,-98,0,64,33,-21,32,99};
//冒泡排序
for(int i = 0;i < arr.length - 1;i++){
for(int j = 0;j<arr.length - 1 - i;j++){
if(arr[j] > arr[j + 1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
}
7.Array工具类的使用:
1.定义在Java.util包下
2.Arrays:提供了 很多操作数组的方法
使用:
package sgg;
import java.util.Arrays;
/*java.util.Arrays:操作数组的工具类,里面定义了很多操作数组的方法 */
public class sgg{
public static void main(String[] args) {
//1.boolean equals(int[] a ,int[] b )判断两个数组是否相等
int[] arr1 = new int[]{1,2,3,4};
int[] arr2 = new int[]{1,3,2,4};
boolean isEquals = Arrays.equals(arr1,arr2);
System.out.println(isEquals);
//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));
}
}