Java干货学习第五天-数组遍历,排序,二分法

本文介绍了Java中的数组遍历,包括强化for循环和传值与传引用的区别。接着讲解了两种排序算法:冒泡排序和选择排序的原理及实现。最后,探讨了二分法查找的步骤及其适用场景,强调其在有序列表查找中的高效性。
摘要由CSDN通过智能技术生成

遍历

for/each 强化for循环;

int[] num = {1,23,3};
for(int a : num){}

就是把num数组中每一个量挨个传给a;
int a[] = new int[]{1,2,3,3}
使用场景:传递参数为字面量\;
比较字符串使用squals方法,不能使用==;
比较基本类型是比较值,而引用类型(类,数组,接口)是比较内存地址;

传值和传应用

传值指的是基本类型的传递;
两个值互不相关;
传引用指引用类型的传递;
传递的是地址;

public static void mian(String[] args){
	int i =2;
	m1(i);
	System.out.println(i);// 2
	int[] arr = (1,2,3);
	m2(arr);
	System.out.println(arr[0]);// 100
}
public static void m1(int i ){
	i++;
	System.out.println(i);// 3 传值
}
public static void m2(int[] arr){
	arr[0] = 100;
	System.out.prinln(arr[0]);// 100 传引用
}

System.arraycopy(复制源数组,源数组起始位置(包含),目标数组,目标数组起始位置(包含),复制个数);
复制是替换复制;
二维数组长度表示内部有多少个一维数组;
因为二维数组中保存的是一维数组,所以获取的时候要使用一维数组的类型进行接收;
一维数组中可能有个数不一致的情况;

int[][] b = new int[3][];
b[0] = new int[1];
b[1] = new int[2]; 

分别对每个数组进行初始化;
二维数组加两个循环能够形成一个表;
Java中没有多维数组,只有数组的数组;
多维数组也不一定要是规则的矩形;
System.out.println()中,println是属于out的;
System.in标准控制台输入;
使用一个类,必须先找到类名,然后用包名.类;
js中有eval可以识别字符串中的运算;
JDK自带的类可以实现调用JS的功能;

String str = scanner.nextLine();
ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
doublic result = (double)jse.eval(str);

排序

冒泡排序(升序为例):比较相邻的两个元素,如果第一个比第二个大,就交换位置;对每一对相邻元素做相同工作,一轮之后,最大的元素就移动到最后了;针对所有元素重复以上步骤,除了最后一个;每次循环的一对元素越来越少,直到只剩下一个元素,终止。
外层循环决定循环的次数,内层循环是决定每次循环的比较次数;

int count = 0;
for(int i = 0;i<num.length-1;i++){
	for(int j =0;j<num.length-1-i;j++){
		if(a[j]>a[j+1]){
			int temp = a[j+1];
			a[j+1]=a[j];
			a[j+1]=temp;	
		}
	}
}

选择排序(升序为例):每次把最小的放最左边;先拿出第一个元素,假设是最小的,挨个和后面元素比较;比较一轮之后直到谁最小,然后换位;重复执行;

for(int i =0;i<a.length;i++){
	int min=i;// 假设第一个元素最小
	for(int j=i+1;j<a.length;j++){// j不能从0开始
		if(a[min]>a[j]){
		// 循环一次后,min是最小元素的下标
			min=j;
		}
	}
	if(min!=i){
	// 判断min=i;如果等于i说明i是最小的,不是,说明有比i还小的进行换位
		int temp = a[min];
		a[min]=a[i];
		a[i]=temp;
	}
}

API排序,就是Arrays.sort(数组名),就是只能升序,不能进行降序;字符串在里面排序是按照ASCII码进行排序,比较第一位然后比较第二位,以此类推。

二分法查找

确定起始,结束和中间;
目标数值m与中间数据进行比较;
如果m大于中间值,则起始值变成中间值+1,结束值不变;
如果m小于中间值,则结束值变成中间值-1,起始值不变;
目标数据相同,返回中间值;
若起始大于结束,返回-1,表示没有查找到;
适用于不经常变动而查找频繁的有序列表;

while(startPos<=endPos){
	if(num==a[m]){
		return m;
	}else if(num>a[m]){// 查后半截
		startPos=m+1;
	}else{
		endPos = m-1;// 查前半截
	}
	m=(startPos+endPos)/2;//重新生成中间值
}
return -1;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卑微-程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值