#数组
为什么需要数组
比如:
再比如:
我们可以把这些数据都存在数组里面
什么是数组?
数组是一个变量,用来存储一组相同数据类型的数据
声明一个变量就是再内存空间画出一块合适的空间
声明一个数组就是在内存中间划出一串连续的空间
数组的结构和基本要数
*标识符:数组的名称,用于区分不同的数组
*数组元素:向数组中存放的数据
*元素的索引(下标|角标):对数组元素进行编号
*元素类型:数组元素的数据类型
注意:
1.数组只有一个名称,即标识符
2.元素索引标明了元素在数组中的位置,下标从0开始
3.数组中的每个元素都可以通过索引来访问
4.数组长度固定不变,避免数组索引越界
5.数组变量属于引用数据类型
如何使用数组
使用数组的方式
1.动态初始化:
数组的创建与初始化分开完成
int[] a = new int[3]; a[0] = 1;//通过索引赋值 a[1] = 2; a[2] = 3;
2.静态初始化
在创建数组对象时就完成初始化
int[] a = {1,2,3};
int[] a = new int[]{1,2,3};
单独的去除数组里面的值:
//因为数组使用索引操作,下标从0开始 System.out.println(a[0]); System.out.println(a[1]); System.out.println(a[2]);
利用循环取出数组的值:
/* a.length 是求出输出的长度 a.length结果为3 因为索引从0开始,所以 i = 0; */ for(int i = 0;i < a.length ; a++){ // i的最大值为2 ,所以判断的时候 i<a.length System.out.println(a[i]); }
操作数组的时可能会出现哪些异常?出现这些异常的原因是什么?
数组索引越界异常: ArrayIndexOutOfBoundsException
原因:访问了数组中不存在的索引
例如: int[] a = {1,2,3}; System.out.println(a[3]);
空指针异常: NullPointerException
原因:当数组的索引被置为null,然后还去访问数组里面的元素,就会出现空指针异常。
练习:循环打印 String[ ] name = {"黄铜","白银","黄金","砖石","嘴强王者"};
求1+2+3+4+...+100的 奇数和 与 偶数和
求 int[] arr = {1,56,4564,61,3,165,4};的最大值与最小值
增强for循环遍历数组
int[] b = {3,4,5,2,1}; for(int i : b){ System.out.println(i);// 不能操作索引 }
排序算法
冒泡排序
什么是冒泡排序呢?
冒泡排序是计算机领域一种较简单的排序算法。
它重复地访问要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。访问数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名“冒泡排序” 。
原理:
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个
2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数
3.针对所有的元素重复以上的步骤,除了最后一个(因为最后一个是最大的,不需要比较)
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较(最后一个数不需要比较,因为它是最小的)
什么时候用到排序?
总结:
升序排列时,比较的时候如果满足条件就交换值,每次可以确定一个最大值。
不用与每次确定下来的最大值最大值进行比较
确定了倒数第二打的值,那个最小的值不用与其余的值比较
有排行榜的位置就涉及到排序,范围之广,用处之多大家可以体会得到排序的重要性
下面演示冒泡排序:
int[] arr = {9, 1, 7, 5}; // 利用冒泡排序算法进行升序排列
for(int z = 0;z < arr.length-1;z++){ for(int x = 0;x < arr.length -1 - z;x++){ if(arr[x] > arr[x + 1]){ int temp = arr[x]; arr[x] = arr[x + 1]; arr[x+1] = temp; } } } for(int i = 0;i<arr.length;i++){ System.out.println(arr[i]); }
选择排序
什么是选择排序呢?
选择排序是一种简单直观的排序算法。
用第一个元素依次以后面的比较,满足条件则交换。
如果是升序每次可以确定一个最小值
如果是降序每次可以确定一个最大值
升序情况下:
用第一个元素与后面的依次比较以后就可以确定第一个元素是最小值,然后就用第二个元素去比较确定倒数第二小的值,以此类推,比较到倒数第二个元素确定时,最后一个元素就是最大值
int[] a = {9,1,7,5,3};
for(int i = 0;i<a.length -1;i++){ for(int j = i+1;j<a.length;j++){ if(a[i] > a[j]){ int temp = a[i]; a[i] = a[j]; a[j] = temp; } } } for(int k : a){ System.out.println(k); }
插入排序
原理:
将初始序列中的第一个元素作为一个有序序列,然后将剩下的 n-1 个元素按关键字大小依次插入该有序序列,每插入一个元素后依然保持该序列有序,经过 n-1 趟排序后使初始序列有序
初始序列:int[ ] a = {9,1,7,5};
第一步:
第二步:
第三步:
如下所示:
for(int i = 1;i<a.length;i++){ // 因为值是从第二个位置(索引为1)拿出来的 所以 i 从 1 开始 int temp = a[i]; // 把a[i] 赋值给 temp 变量 int j = i - 1; // j 当作一个索引 ,a[j] 的值就是temp值的前一位值 while(j>=0 && a[j] > temp){// a[j] > temp ,把拿出来的值与前面的做比较 a[j+1] = a[j]; // 如果满足条件就把前面的值放到后面来 j--; // j-- , 因为要把拿出来的值依次与前面的值比较, // while里面的 j >=0 ,在这里当 j=0时,j--会索引越界 所以 j>=0 } a[j+1] = temp; // 把拿出来的值放到指定的位置(根据比较的结果来放入) }