第4章-第3节-Java中跟数组相关的几个算法以及综合应用
在写这篇博文之前,先大概说明一下,就是很常见的数组算法如求最大值、一维数组的遍历等,这里就不去专门说明了,只说一些有代表性的,然后就是冒泡排序算法很容易查阅到,这里也不专门说明了,只说明一个较冒泡难理解一点点的选择排序,最后再说一下,就是这些算法都是练习自己的思维能力,其实有些功能如果你不想做,可以直接用java.util.Arrays这个类库就可以达到效果。
1、一维数组的反转问题:已知数组为arr;
方法1:首尾对换(推荐采用异或去进行交换,具体方法查看我C语言专栏里的博文);
for(int i = 0; i < arr.length / 2; i++){
int temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
}
方法2:定义两个起点(左端起点、右端起点);
for(int i = 0,j = arr.length - 1; i < j; i++,j--){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
方法3:创建一个新数组,把原数据倒序输入到新数组;
int[] newArr = new int[arr.length];
for(int i = arr.length - 1,j = 0; i >= 0; i--,j++){
newArr[j] = arr[i];
}
2、选择排序升序:(推荐采用异或去进行交换,具体方法查看我C语言专栏里的博文)
//外层循环控制轮数,此处的i可以认为是选中空间
for(int i = 0;i <= arr.length - 2;i++){
//内层循环控制每一轮执行的次数,此处的j可以认为是比较空间
for(int j = i + 1;j <= arr.length - 1;j++){
if(arr[i] > arr[j]){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
选择排序大概思路:拿升序作例子,从0元素开始,把它分别和后面的元素去对比,如果0元素大于它,那么就去交换,0元素做一轮下来,最小的数就会在0元素位置了,接着第二轮从1元素开始,把它分别和后面的元素去对比,如果1元素大于它,那么就去交换,这一轮做完那么第二小的数会在1元素位置,依次类推,一直做下去,最后实现上就是外层循环为选中的某一个位置的元素,然后内循环就是拿这个位置的元素去和它后面所有的数去对比,最后根据大小进行处理。
3、常规应用:
1)、打印如下的效果
? ? ? ? ? ?11111
? ? ? ? ? ?22222
? ? ? ? ???33333
? ? ? ? ? ?44444
? ? ? ? ? ?55555
//创建二维数组对象 5行5列
int[][] arr = new int[5][5];
//循环操作
//外层循环控制行数/轮数 ==> 理解:锁定/定位到每一个一维数组
for(int i = 0;i <= arr.length - 1;i++){
//内层循环控制每一行的列数 ==> 理解:定位当前一维数组的每个元素
for(int j = 0;j <= arr[i].length - 1;j++){
//为当前一维数组的每个元素显示赋值
arr[i][j] = i + 1;
//获取当前一维数组的每个元素,打印看效果
System.out.print(arr[i][j]);
}
//单独换行
System.out.println();
}
2)、打印如下的效果
?? ??? ??? ?1
?? ??? ??? ?22
?? ??? ??? ?333
?? ??? ??? ?4444
?? ??? ??? ?55555
//创建二维数组对象 5行
int[][] arr = new int[5][];
//循环创建5个一维数组对象,将地址关联到二维数组元素位置
for(int i = 0;i <= arr.length - 1;i++){
arr[i] = new int[i + 1];
//循环操作 => 为当前一维数组的每个元素显示赋值&当前元素内容
for(int j = 0;j <= arr[i].length - 1;j++){
arr[i][j] = i + 1;
System.out.print(arr[i][j]);
}
System.out.println();
}
3)、综合应用:
import java.util.Random;
import java.util.Scanner;
/**
* 需求:保存全班的每个组的成绩,并对成绩做统计
*
* 1. 从键盘输入一共有几组
* 2. 从键盘输入每一组分别有多少人
* 3. 每个人的成绩随机生成(这里用随机方便一点,如果手动输入太累了,其实最后效果都一样)
* 4. 统计每一组的最高分、最低分
* 5. 统计每一组的平均分
* 6. 统计全班的最高分、最低分
* 7. 统计全班的平均分
* 8. 统计全班的总人数
*/
public class Work {
public static void main(String[] args) {
int[][] array = getArray();
System.out.println("--------------------------------------------------------------------------------------------");
groupScore(array);
allScore(array);
}
//处理1、2、3
public static int[][] getArray(){
Random r = new Random();
Scanner sc = new Scanner(System.in);
System.out.println("请输入一共有多少组:");
int groupNum = sc.nextInt();
while (groupNum < 1) {
System.out.println("输入有误,重新输入一共有多少组:");
groupNum = sc.nextInt();
}
int[][] arr = new int[groupNum][];
for (int i = 0; i < groupNum; i++) {
System.out.println("请输入第" + (i + 1) + "组有多少人:");
int peopleNum = sc.nextInt();
while (peopleNum < 1) {
System.out.println("输入有误,重新输入第" + (i + 1) + "组有多少人:");
peopleNum = sc.nextInt();
}
arr[i] = new int[peopleNum];
for (int j = 0; j < peopleNum; j++) {
arr[i][j] = r.nextInt(100) + 1;
}
}
sc.close();
for (int i = 0; i < arr.length; i++) {
System.out.print("第" + (i + 1) + "组:");
for (int j = 0; j < arr[i].length; j++) {
System.out.print("第" + (j + 1) + "人成绩=" + arr[i][j] + "\t");
}
System.out.println();
}
return arr;
}
//处理4、5
public static void groupScore(int[][] arr) {
for (int i = 0; i < arr.length; i++) {
int max = arr[i][0];
int min = arr[i][0];
int sum = 0;
for (int j = 1; j < arr[i].length; j++) {
if (arr[i][j] > max) {
max = arr[i][j];
}
if (arr[i][j] < min) {
min = arr[i][j];
}
sum += arr[i][j];
}
System.out.println("第" + (i + 1) + "组最高分为:" + max + ",最低分为:" + min + ",平均分为:" + (sum / arr[i].length));
}
}
//处理6、7、8
public static void allScore(int[][] arr) {
int max = arr[0][0];
int min = arr[0][0];
int sum = 0;
int peopleNum = 0;
for (int i = 0; i < arr.length; i++) {
peopleNum += arr[i].length;
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] > max) {
max = arr[i][j];
}
if (arr[i][j] < min) {
min = arr[i][j];
}
sum += arr[i][j];
}
}
System.out.println("全班最高分为:" + max + ",最低分为:" + min + ",平均分为:" + (sum / peopleNum));
}
}
本电子书目录:《Java基础的重点知识点全集》
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!