JavaSE- day07(数组中的算法)

算法基础

概念
利用代码解决生活中的数学问题
优点
提高代码的执行效率
如何判断算法的执行效率
时间复杂度:
	代码执行的时间长短(执行次数)
空间复杂度:
	代码在执行的时候,所占的内存

常用的算法

两个数字交换
	int a = 1;
	int b = 2;
	int c = a;
	a = b; 
	b = c;
	就实现了数据得交换
寻找最值
//定义一个数组
	int[] nums = {1,2,4,5,87};
	//定义一个数据,存储最大值
	int max = 0;
	//定义一个数据,存储最小值
	int min = 0;
	//遍历数组
	for(int i = 0; i < nums.length; i++){
		//判断数据的大小
		if(max < nums[i]){
			max = i;
		}
		if(min > nums[i]){
			min = i;
		}
	}
	System.out.println("最大值为:" + nums[max]);
	System.out.println("最小值为:" + nums[min]);
寻找最值得下标
//定义一个数组
	int[] nums = {1,2,4,5,87};
	//定义一个数据,存储最大值下标
	int maxIndex = 0;
	//定义一个数据,存储最小值下标
	int minIndex = 0;
	//遍历数组
	for(int i = 0; i < nums.length; i++){
		//判断数据的大小
		if(maxIndex < nums[i]){
			maxIndex = i;
		}
		if(minIndex > nums[i]){
			minIndex = i;
		}
	}
	System.out.println("最大值下标为:" + minIndex );
	System.out.println("最小值下标为:" + maxIndex );

排序

冒泡排序
	//特点:
		//比较相邻两个数字的大小
	//定义一个数组
	int[] nums = new int[]{1,12,87,45,36};
	//首先取数组中的第一个数字
	for(int i = 0; i < nums.length; i++){
	//然后在取其相邻后边的数字,由于是比较当前数字的后一个数字所以,j=i
		for(int j = i + 1; j < nums.length - 1; j++){
			//最后进行判断,比较其中的数字的大小,并将其替换位置
			if(nums[i] > nums[j]){
				//定义中间变量,来辅助值得转换
				int x = nums[i];
				nums[i] = nums[j];
				nums[j] = x;
			}
		}
	}
	//最后在遍历数组,即可
	for(int i : nums){
		System.out.print(i + " ");
	]
选择排序
	//特点:
		//每次利用获取到 得最大值得 下标来排序
	//定义一个数组
	int[] nums = new int[]{1,12,87,45,36};
	
	//其中得减一是排序到最后一个数据后已经不需要进行排序; 
	//
	for(int i = 0; i < nums.length - 1; i++){
		//定义其目标数据得角标,目标函数下标是往上增加的
		int index = i;
		//定义最大值得角标,从目标函数开始算起
		int max  = i;
		//j = i的原因:在i 前边的数据是已经进行判断过的,不需要进行重复判断
		for(int j = i; j < nums.length; j++){
			//获取最大值的角标	
			if(nums[max] < nums[j]){
				max = j;
			}
		}
		//交换数据
		//首先判断一下当前角标与最值角标是否相等,如果相等,则不需要交换
		if(i != max){
			//定义辅助变量
			int x = nums[max];
			nums[max] = nums[index];
			nums[index] = x;
		}
	}
	
JKD提供得工具类,进行排序
Arrays.sort(数组);
注意:
	默认排序出来的是从小到大;

二维数组

概念
将一维数组作为数据放在数组中
使用
声明
语法:
	 二维数组类型 [] []   数组名字;
创建
语法:
	静态:
		数据类型 [][]  数组名字 = {{数据1} , {数据2} , ... ,{数据n}}
	动态:
	    数据类型 [][]  数组名字 = new 数据类型[二维数组中一维数组的个数][一维数组中数据的个数(这个可有可无)];
		数据类型 [][]  数组名字 = new 数据类型[][] {{数据1} , {数据2} , ... ,{数据n}};
操作
取值
	语法:
		数组名字[一维数组在二维数组中的下标][一维数组中的下标];
		
改值:
	数组名字[一维数组在二维数组中的下标][一维数组中的下标] = 值;
	
获取长度:
	获取二维数组中一维数组中的长度:
		数组名字[一维数组在二维数组中的下标].length;
	获取二维数组中一维数组的个数:
		数组名字.length;
特殊操作(二维数组得遍历)
语法:
	for(int i = 0; i < 数组长度; i++){
		for(int j = 0; j < 数组名字[i].length; j++){
			System.out.print(数组名字[i][j] + "  ");
		}
	}
杨辉三角
/**
	1
	1 1
	1 2 1
	1 3 3 1
*/
//杨辉三角必须用二维数组实现
//首先定义一个二维数组,先给其固定长度
int[][] nums = new int[7][7];

for(int i = 0; i < nums.length; i++){
	for(int j = 0; j < nums[i].length;j++){
		if(i == 0 || j == 0 || j == i){
			nums[i][j] = 1;
		}else if(j < i){
			nums[i][j] = nums[i - 1][j] + nums[i- 1][j - 1];
		}
	}
}
//然后循环输出
for(int[] i : nums){
	for(int j : i){
		if(nums[i][j] != 0){
			System.out.print(j + "\t");
		}
	}
	System.out.println();
}

二分查找

//特点:	
	//利用中间值来获取要查找的值
	==注意:前提条件是提供的数据必须是拍完顺序的==
//首先定义一个数组
int[] nums = new int[]{1,12,87,45,36};
//定义要查找的数据
int a = 12;
//定义起始下标
int start = 0;
//定义末尾下标
int end = nums.length - 1;
//定义中间值下标
int center = (start + end) /2;
//定义标志位
boolean flag = false;
while(start <= end){
	if(a > nums[center]){
	start = center + 1;
	int center = (start + end) /2;
	}else if(a < nums[center]){
		end = center - 1;
		int center = (start + end) /2;
	}else if(a == nums[center]){
		flag = true;
		break;
		//不能用return ,直接把方法结束了
		//return;
	}
}
if(!flag){
	System.out.print("数组中没有该值!");
}else{
	System.out.print(" 该数字在数据中的下标为:" + center);	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值