Day05-数组

一、Eclipse的使用

二、数组(引用类型)

存储数据:

  • 变量:每一个变量,只能存储一种数据类型的一个数据

​ int i = 10;

  • 数组:可以存储同种类型的多个数据。有:一维数组、二维数组、多维数组
public static void main(String[] args) {
		/*
		 * 数组的动态初始化,在声明的时候,指定数组的长度而不指定元素
		 * 元素通过后期动态的方式来指定
		 */
		int arr1[] = new int[10];
		/*
		 * 数组的静态初始化方式1
		 */
		int arr2[] = {1,2,3};
		
		/*
		 * 数组的静态初始化方式2
		 */
		int arr3[] = new int[] {1,2,3};
		
		/*
		 * 数组中元素的引用,通过 下标/索引 来引用
		 * 数组的下标是从0开始的
		 */
		arr1[0] = 10;
		arr1[1] = 20;
		arr1[3] = 30;

		/*
		 * 使用for循环遍历
		 */
		for (int i = 0; i < arr1.length; i++) {
			System.out.println(arr1[i]);
		}
		
   		
	}

数组存在默认值

​ 整型的默认值:0

​ 浮点型的默认值:0.0

​ 字符型的默认值:空格

​ 布尔型的默认值:false

		/*
		 * 增强for循环/for...each
		 */
		for (int i : arr1) {
			System.out.println(i);
		}

三、方法

概念:完成特定功能的代码块

定义形式

​ 修饰符 返回值类型 方法名(参数类型 参数名称 多个参数用逗号的隔开)

​ 方法定义的时候,所定义的参数称为形式参数,简称形参

​ 使用方法的时候,所传入的参数称为实际参数,简称实参

方法的返回值:

​ 有返回值 确定返回值的类型 可以是基本类型也可以是引用类型

​ 有返回值时 需要在方法体的最后 使用return 语句来返回对应类型的变量或者数据

​ 没有返回值 void

​ 形参也分为有和没有

方法的使用:

​ 方法需要调用才可以执行 除main方法 其他方法都必须调用才能执行 不调用不执行

四、JVM 内存

JVM在执行Java程序时,会把它管理的内存划分为若干个的区域,每个区域都有自己的用途和创建销毁时间,可以分为两大部分,线程私有区和共享区:

在这里插入图片描述

1.线程私有区

程序计数器:当同时进行的线程数超过CPU数或其内核数时,就要通过时间片轮询分派CPU的时间资源,不免发生线程切换。这时,每个线程就需要一个属于自己的计数器来记录下一条要运行的指令。

Java虚拟机栈:描述Java方法执行的内存模型,每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。与线程同时创建。每个方法执行时都会创建一个栈帧来存储方法的信息,新调用的方法入栈,返回的出栈,所以栈的大小决定方法调用的可达深度。

本地方法栈,与虚拟机栈作用相似。但它不是为Java方法服务的,而是本地方法。不同虚拟机实现的方法不同。

2.线程共享区

此区域是用来存储被各线程共享的数据

方法区:用于存放加载类的元数据信息,存储已被虚拟机加载的类信息、常量、静态变量即时编译器编译后的代码数据等(这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载)

堆:存放对象实例和数组,在虚拟机启动时创建,是垃圾回收的主要区域。

五、排序算法

1.冒泡排序

public static void sort(int arr[]) {
		int temp = 0;
		for (int i = 0; i < arr.length - 1 ; i++) {//控制次数
			for (int j = 0; j < arr.length - i - 1; j++) {
				if(arr[j] > arr[j+1]) {
					temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}
		}
	}

2.快速排序

public static void quickSort(int arr[],int left,int right) {
		if(left > right) {
			return;
		}
		
		int base = arr[left];
		int i = left;
		int j = right;
		//当i与j不相遇时,i向右移动,j向左移动,j先移动
		while(i != j) {
			//j位置的值小于基准数时停下,否则一直向左检索
			while(arr[j] >= base && j > i) {
				j--;
			}
			//i位置的值大于基准数时停下,否则一直向右检索
			while(arr[i] <= base && j > i) {
				i++;
			}
			//此时,各自已经找到,作交换操作
			int temp = arr[i];
			arr[i] = arr[j];
			arr[j] = temp;						
		}
		
		//此时,i与j已相遇,使基准数位置的数与该位置的数作交换
		arr[left] = arr[i];
		arr[i] = base;
		
		//此时,i位置的数 左边的数 比它都小,右边的数比它都大
		//再排左边的
		quickSort(arr, left, i - 1);
		//再排右边的
		quickSort(arr, i + 1, right);
		
	}

3.选择排序

public static void selectSort(int arr[]) {
		for (int i = 0; i < arr.length; i++) {
			//假设第一个值为最小值
			int min = i;
			//遍历寻找比arr[min]还小的值,遍历完arr[min]为最小值,用min记录最小值的下标
			for (int j = i; j < arr.length; j++) {
				if(arr[min] > arr[j]) {
					min = j;
				}
			}
			//使当前循环最小值元素 与 当前循环的第一个元素做交换
			int temp = arr[min];
			arr[min] = arr[i];
			arr[i] = temp;
		}
	}

4.插入排序

public static void insertSort(int arr[]) {
		for (int i = 0; i < arr.length - 1; i++) {
			for (int j = i + 1; j > 0; j--) {
				if(arr[j] < arr[j - 1]) {
					int temp = arr[j];
					arr[j] = arr[j-1];
					arr[j-1] = temp;
				}else {
					break;
				}
			}
		}
	}

5.排序性能对比

在这里插入图片描述

6.排序算法的选择

(1)若n较小(如n≤50),可采用直接插入或直接选择排序

当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插入,应选直接选择排序为宜。

(2)若文件初始状态基本有序(指正序),则应选用直接插入、冒泡或随机的快速排 序为宜

(3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或 归并排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值