CGBTN2108-DAY05总结复习

Posted 程序媛 泡泡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CGBTN2108-DAY05总结复习相关的知识,希望对你有一定的参考价值。

DAY05 复习

数组

1. 数组的创建方式

1.1 静态创建

int[] a = {1,2,3,4,5};
int[] a = new int[]{1,2,3,4,5};

1.2 动态创建

int[] a = new int[5];

2. 数组创建的过程

  1. 在内存中开辟一块连续的内存空间,用来存放多个相同类型的数据
  2. 给数组完成初始化的过程,给每个元素赋予数组对应类型的默认值,比如int的默认值是0
  3. 数组完成初始化后会分配一个唯一的地址值
  4. 把唯一的地址值交给数组的引用类型变量【数组名】来保存
  5. 如果想要操作数组中的元素,可以根据变量保存的地址找到数组,然后根据下标来操作数组的具体元素
    数组名保存的是数组的地址值,不是数组中每一个具体的元素,数组名是一个引用类型的变量

3. 数组的特性

  1. 我们是通过数组的下标来操作数组中的元素的,数组下标从0开始,最大下标是数组的长度-1
    数组的下标是我们能够进行操作数组的唯一的手段
    不能访问不属于这个数组的下标,否则会数组下标越界异常
  2. 数组的长度我们可以通过“数组名.length”来获取
    数组一旦创建,长度不可改变
    如果想要增加或者是删除数组中的元素,需要创建新长度的数组,无法改变原数组的长度

4.数组的工具类Arrays

  1. toString(数组名):用来查看当前数组的所有具体元素
    除了char类型的数组底层做了处理以外,其他任何类型的数组,想要查看数组的具体元素,都必须使用此方法
    如果不使用这个方法,直接打印数组名,打印的是数组的地址值
  2. copyOf(要复制的原数组,新数组的长度):用来进行数组的普通复制/扩容/缩容
    如果新数组的长度大于原数组的长度–数组的扩容,不够的位置还是默认值
    如果新数组的长度小于原数组的长度–数组的缩容,类似于原数组的截取
    如果新数组的长度等于原数组的长度–数组的普通复制
    注意:不管是以上哪种操作,都不是操作原数组,而是创建了一个新的数组
  3. sort(数组名):利用优化后的快速排序算法对数组进行排序,这个排序算法是直接对原数组做修改的

5. 数组的遍历

  1. 如果只是想查看数组中有哪些元素,直接使用System.out.println(Arrays.toString(方法名));就可以
  2. 如果想要拿到数组中的一个个的具体元素,或者是对数组中的元素做进一步的操作,就需要对数组进行遍历
  3. 遍历:把数组中的所有元素,从头到尾逐个“过一遍”
  4. 通过循环遍历数组,所以循环中的循环变量代表的是数组的下标
public class ReviewDemo {
	public static void main(String[] args) {
		int[] a = new int[10];
		for(int i = 0;i<a.length;i++) {
			//System.out.println(i);//打印的是数组的下标0-9
			a[i] = i+11;//a[i]代表的是数组中每一个具体的元素
		}
		System.out.println(Arrays.toString(a));
		//[11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
	}
}

6. 冒泡排序

冒泡排序详细笔记

  1. 冒泡排序只是众多排序算法的一种,主要是为了让大家去拓展思维,接近底层
  2. 后续大家也可以对其他排序算法进行进一步的拓展:二分查找、快速排序、全排序、归并排序。。。
  3. 排序思路:
    1)我们需要比较多轮,如果有n个数,最多比较n-1轮
    2)在每一轮中,需要进行多次的相邻比较,如果位置不对,就互换
    注意:前面轮中确定的最大值,不需要参与本轮的比较
    3)我们使用的是嵌套for循环来完成的:
    外层循环循环变量代表的是轮数【数组的长度-1】
    内层循环循环变量代表的是数组的下标【轮数越后,次数越少,所以j 随着i 的增大而减小】
    4)优化思路:
    之前轮中的最大值,不需要参与本轮的比较
    如果顺序没有那么乱,我们有可能不需要比较n-1轮,这个时候就需要确定什么时候提前结束剩下的轮数
    所以,我们可以设置一个信号量flag,初始值为false,如果一但发生数据的交换,说明顺序还为排好,我们就把flag改为相反的值true,在本轮所有相邻比较结束以后,判断flag是初始值还是中途被修改成了true,如果所有相邻比较都完成,flag没有中途被修改,说明所有数据没有发生交换位置,也就是说,数据已经提前排好序了,那么我们就直接结束剩下几轮的循环,提高效率。
package cn.tedu.array;

import java.util.Arrays;

/**本类用于实现冒泡排序*/
public class BubbleSort {
	public static void main(String[] args) {
		//1.创建一个无序的数组
		int[] a = {17,96,18,25,26};
		
		//3.实际开发中使用Arrays数组工具类的排序方法sort(数组名);
		Arrays.sort(a);
		System.out.println(Arrays.toString(a));
		
		//2.调用排序的方法进行排序
		//method(a);
	}
	//本方法用来实现冒泡排序
	private static void method(int[] a) {
		//1.外层循环 从哪开始1  到哪结束a.length-1  怎么变化++
		/**控制的是轮数,假如有n个数,最多比较n-1轮
		 * 注意i代表的是第几轮,轮数
		 * 从第1轮开始,最大轮数就是n【数组元素个数a.length】-1*/
		for(int i=1; i <= a.length-1;i++) {
			boolean flag = false;//冒泡排序优化,设置一个信号量
			System.out.println("第"+i+"轮");		
			//2.内层循环 从哪开始0 到哪结束a.length-i
			/**控制的是在这一轮中比较的次数
			 * 注意j代表的是数组的下标,因为我们要通过下标操作数组中的元素,相邻比较
			 * 从数组的0号下标开始,最大下标不是固定的,随着i的变化而变化、
			 * 注意:上一轮确定的最大值,不需要参与本轮的比较,所以i轮确定i个,要-i
			 * */		
			for(int j = 0; j<a.length-i;j++) {
				//3.相邻比较,位置不对,就互换位置
				if(a[j] > a[j+1]) {//如果前面的数大于后面的数
					//就交换两个位置上的元素
					int t;
					t = a[j];
					a[j] = a[j+1];
					a[j+1] = t;	
					flag = true;
				}
			}
			if(flag == false) {//如果经历了内层循环的所有比较,flag还是初始值
				//说明,所有数据已排序成功,无需进行下一轮排序
				break;
			}
			System.out.println("第"+i+"轮排序后的效果:"+Arrays.toString(a));
		}
		System.out.println("排序完成后的数组"+Arrays.toString(a));
	}
}

以上是关于CGBTN2108-DAY05总结复习的主要内容,如果未能解决你的问题,请参考以下文章

CGBTN2108-DAY04总结复习

CGBTN2108-DAY12总结复习

CGBTN2108-DAY10总结复习

CGBTN2108-DAY14总结复习

CGBTN2108-DAY13总结复习

CGBTN2108-DAY08总结复习