目录
1.二分查找(前提:在有序的集合中)
快速排序(21世纪最伟大的算法)和归并排序nlogn数量级
将数组分为了left,mid,right。根据查找元素和mid的大小关系调整left或right取值--折纸过程
以升序数组为例:
1.先比较要查找的元素和中间元素的大小关系mid
mid==toFind
return mid
2.toFind>mid,我们就从mid+1继续上述过程
left=mid+1;
3.toFind<mid,从mid-1开始作为查找的子区间
注意:left=right时,说明此时区间里只剩下一个元素,当left<right,说明为空区间。
二分查找的查找次数:每次根据查找元素的大小与中间位置的元素相比将区间变为原来的1/2
到区间只剩下最后一个元素时终止,所以查找次数是logn级别的
public static int binerarySearch(int []arr,int val){ int left=0; int right=arr.length-1; while(left<=right) {//如果不懂举个例子 int mid=(right+left)>>1; if(arr[mid]==val){ return mid; }else if (val > arr[mid]) { left = mid + 1; }else{ right= mid - 1; } } return -1; } }
2.递归实现二分查找
public static int binerarySearch2(int[] arr,int val){ return binarySearchInternal(arr,val,0, arr.length-1); } public static int binarySearchInternal(int [] arr,int val,int left,int right){ if(left>right){ //空区间 return -1; } int mid=(left+right)/2; if(arr[mid]==val)return mid; else if(val<arr[mid]){ return binarySearchInternal(arr,val,0,mid-1); }else{ return binarySearchInternal(arr,val,mid+1, arr.length-1); } }
3.面试题
在500w的集合中找到特定元素
1.先使用快排给数组排序Array.sort(arr);这个方法默认是升序的
2.二分查找
4.将数组转为字符串
序列化:把任何类型转为String类型
这样写输出的是地址,后面是地址的哈希码
写为System.out.println(Arrays.toString(arr));打印的是值
Arrays是JDK内置的工具类,java.util.Arrays
java类命名-s就是java的工具类(内置了很多实用操作)
Collections
5.复习:数组
a.数组的初始化操作分为静态和动态
静态初始化:int[]arr={1,3,5};
动态初始化:int []arr=new int[3];赋值是写为:int[] arr=new int[]{1,3,5};
b.关于数组长度的取得和访问元素
数组名称.length
索引:0-length-1
c.内存区域划分:JMM------六块区域
栈:方法的局部变量(形参,方法中定义的若干变量)
堆:只要new出来的对象都在堆中存储
如:
引用只是给对象起了个别名,保存的是对象的地址。
问: 假设现在有俩个数组引用:引用b对于数组内容的修改影响引用a指向的数组内容?
答:就要看引用a和b是否保存同一块地址。
6.引用数据类型值null的情况
1.所有引用的默认值为null
2.当引用数据类型保存的值为null时,表示该引用没有指向任何内存空间,若仍然使用该引用去访问内存,就会报NullPointerException(运行时异常)//程序在运行时异常
7.数组作为方法的返回值(还有就是作为参数的情况)
注:for-each只能用于变量,不能用于改数组
8.数组的拷贝
这个ret是个新数组,所以10被改了
Arrays,copyOf(原数组名称,拷贝后的新数组长度)//从数组的第一个元素开始拷贝
深浅拷贝:拷贝后的数组对象确实是新的对象,只是将原数组的内容复制给新数组
浅拷贝,实际没有创建新的数组,只是整了一个新数组的引用而已。(Cloneable那里讲)
Arrays.copyOfRange(arr,2,4);//从第二个索引到第四个索引,[from,to)。
自己实现一个数组的全拷贝;
public static int[] arrCopy(int [] arr){ int []ret=new int[arr.length]; for (int i = 0; i < arr.length; i++) { ret[i]=arr[i]; } return ret; }
找无序数组中的最大值
9.数组求和的递归方法(俩种)
double sum=sum(arr);小到大类型转换可以
冒泡排序的思路:
从第一个元素开始两两比较,将大元素交换到后面,没走一次保证把较大元素放在最终位置。
优化之后:
i<arr.length-1就可以了
当发现某一趟中没有元素交换,arr[j]<arr[j+1]说明集合已经有序,不用再交换了
10.数组逆序(双引用)
11.数组数字排列
/* * 数组的数字排列(偶数放前面,奇数放后面) * */ public static void transPorm(int [] arr) { int left = 0; int right = arr.length - 1; while (left<right){ while(left<right&&arr[left]%2==0){ left++; } //left指向第一个奇数 while(left<right&&arr[right]%2!=0){ right++; } //right指向第一个偶数 int tmp=arr[left]; arr[left]=arr[right]; arr[right]=tmp; } } }