/*回顾
一、时间复杂度
1.知道常见的时间复杂度
2.能推导出时间复杂度
算法:解决问题的方法;
时间:
空间:
函数:O(1),O(n),O(logn),O(n^2),O(n^3),O(n!),O(2^n)
推导:常数O(1);只取最高阶;如果不是常数,去掉常数;
二、双指针:
分离:
对撞:盛水最多容器
快慢:
三、排序
直接选择排序:分成两部分,已排序堆,未排序堆,每次从未排序堆选出最大(小)的元素,放在已排序堆的第i位。
*/
一、冒泡排序
思想:
分成两部分,已排序堆,未排序堆;
过程:
每次比较相邻的两个元素,如果顺序错误,进行交换;整合排序过程很像水里冒泡。
二、二分查询
查找:从数组中找到符合条件的元素;
让你接收一个数,判断此数是否在数组中存在,如存在,返回位置,不存在,返回-1;
无序:暴力;
有序:
1.暴力;
2.二分:时间复杂度O(logn);
代码:
public static void main(String[] args) { Random r = new Random(); int a[] = new int[10]; for (int i = 0; i <a.length ; i++) { a[i] = r.nextInt(100); } System.out.println(Arrays.toString(a)); Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int left = 0; int right = a.length-1; String info = "查无此数"; while(left<=right){ //找到中间点 int middle = (left+right)>>1; //判断是否相等 if(n==a[middle]){ info = "此数已找到,位置是:"+middle; break; } else if(n>a[middle]){ left = middle+1; } else{ right = middle - 1; } } System.out.println(info); }
三、二维数组
1.二维数组也是一个数组,只不过元素类型是一个数组;
2.二维数组中可以包含多个一维数组,每个一维数组的长度可以不一致(任意);
3.获得二维数组的长度可以使用数组名.length,获得一维数组的长度可以使用一维数组名.length;
int a[];
int a[] [];
每名同学:
数学,语文,外语,物理,化学;
创建四个数组:score1,score2,score3,score4;
创建一个二维数组,包含以上四个元素,每个元素是一个int【】数组;
此时二维数组score的长度为4,因为包含了四个一维数组;
如何定义二维数组
数据类型 数组名[] [] ;
int [] [] a;
数组的初始化
动态初始化
int a[] [] = new int [3] [4] ;//a由三个一维数组组成,每个一维数组的长度都是4,即3行4列;
int a[] [] = new int [3] [ ];//a由三个一维数组组成,每个一维数组并未开辟空间;
a[0] = {2,5,6,7};
a[1] = new int[] {1,3};
a[2] = new int[]{5,6,7};
静态初始化
int a[] [] = new int[] [] {{1,2,3},{3,4,5},{7,8,9,10}};