达内-----二维数组和各种排序

******************先把昨天的作业解决掉******************

a) 写一个彩票的生成代码.

i. 要求

1. 1-33随机选7个无重复的数字(即用数组保存7个数字,所有数字与其下标以前的数字比较,如果有重复的,重新生成).

2. 测试方法用1-8随机选7.

import java.util.Scanner; public class lingxing { public static void main(String args[]) { for (;;) { System.out.print("请输入上半层的列数(输入0退出):"); Scanner sc=new Scanner(System.in); int x =sc.nextInt(); for (int i=1;i<=x ;i++ ) { for (int j=x-i;j>0;j--) System.out.print(' '); for (int k=1;k<=2*i-1;k++) System.out.print("*"); System.out.println(); // System.out.println("\n"); //两个方法都是回车换行 } for (int m=x-1;m>=1;m--) { for(int n=x-m;n>0;n--) System.out.print(' '); for(int s=1;s<=2*m-1;s++) System.out.print('*'); System.out.println(); }if(x==0) break; } } }

*********************这是今天的内容*********************

1 1 2 3 5 8 13 ………….费氏数列

f(n)=f(n-1)+f(n-2) (n>2)

f(n)=1 (0<n<3)

计算数列的第n项值?

import java.util.*; public class Feishi { public static int get(int n){ if (n>2) { return get(n-1)+get(n-2); //递归,即不停的调用自身 }else if(n>0){ return 1; }else{ System.out.println("结束"); return 0; } } public static void main(String args[]) { Scanner sc=new Scanner(System.in); //注意要加括号和System.in for (; ; ) { System.out.println("请输入正整数(大于46的话,会出现件神奇的事,另外,退出请输0):"); int i = sc.nextInt(); System.out.println("经过千辛万苦的计算,结果为:"+get(i)); if (i==0) { break; } } } }

数组拷贝

import java.util.*; public class TestCopy { public static void main(String args[]) { int[] arr1={2,3,4,5,6,7,8,9}; int[] arr2=new int[10]; //要求:把3,4,5,6,7这5个元素从arr1拷贝到arr2的第四个位置开始 //方法一: for (int i=1,j=3;i<6;i++,j++ ) //注意i是小标,arr1中3的下标是1,arr2中第四个位置的下标是3 arr2[j]=arr1[i]; //for与if后面的大括号中如果只有一个;即一个语句,可以省略大括号 System.out.println(Arrays.toString(arr2)); System.out.println("********我是华丽的分隔线*********"); //方法二: System.arraycopy(arr1,1,arr2,3,5); //要小心,不用让数组小标越界!格式为(旧数组,起始下标,新数组,下标范围); System.out.println(Arrays.toString(arr2)); } }

******************************分隔线******************************

数组排序

由大到小 降序

由小到大 升序(强调)

冒泡排序/选择排序/插入排序/快速排序.

冒泡排序:

相邻两个就行比较,如果前面大于后面,交换位置,:

3,5,7,6,4,8,2,1à3,5,6,4,7,2,1,8à进行7次后à1,2,3,4,5,6,7,8

import java.util.*; public class Maopao { public static void main(String args[]) { int[] arr={3,5,7,6,4,8,2,1}; //方法一 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]) { int temp=arr[j+1]; arr[j+1]=arr[j]; arr[j]=temp; //交换算法...注意3条语句的顺序 } } } System.out.println(Arrays.toString(arr)); System.out.println("******我是华丽的分隔线******"); //方法二 Arrays.sort(arr); //jdk提供的排序,也能对字符串进行排序 System.out.println(Arrays.toString(arr)); } }

选择排序(作业):

记录最小的数的下标,与第一个数字交换.n-1个依次交换….

import java.util.*; public class Select { public static void main(String args[]) { int[] arr={3,5,7,6,4,8,2,1}; for (int i=0;i<arr.length;i++) { int min=arr[i]; //注意,这里不能写成int min=0; for (int j=i+1;j<arr.length;j++) { if (min>arr[j]) min=arr[j]; //这里是j,不是i,再次强调用if判断最大最小值 } // System.out.println(min); //检验min for (int k=i+1;k<arr.length;k++) { if(min==arr[k]) { int temp=arr[k]; arr[k] = arr[i]; arr[i] = temp; } } } System.out.println(Arrays.toString(arr)); } }

插入排序(作业):

拿第一个数做一个小的数组,然后把第二个数插入进来,然后插入第三个数….直到n-1

import java.util.*; public class Insert { public static void main(String args[]) { int[] arr1={3,5,7,6,4,8,2,1}; int[] arr2=new int[arr1.length]; arr2[0]=arr1[0]; //先确定第一位 for (int i=1;i<arr1.length;i++) { for (int j=0;j<arr2.length;j++) { if (arr1[i]<arr2[j]) { for (int k=i-1;k>=j;k--) arr2[k+1]=arr2[k]; //将元素循环右移 arr2[j]=arr1[i]; //赋值 break; //记得要跳出循环 }else arr2[i]=arr1[i]; } }System.out.println(Arrays.toString(arr2)); } }

快速排序(常用):

先找一个参照元素(随意),然后把所有比参照小的放在参照前,同时把所有比参照大的放在参照的后面.把数组分成了3部分:比参照小的,参照元素和比笔参照大的三个部分.然后递归处理比参照小的和比参照大的部分

49,67,76,13,15,27

i=1j=6(n)

j开始找,比参照小的数字,找到了交换(j=数字所在的位置-1)

27,67,76,13,15,49 (i=1j=5)

i开始找比参照大的数字,找到了交换(i=数字+1)

27,49,76,13,15,67 (i=3j=5)

重复1,2

27,15,76,13,49,57 (i=3j=4)

27,15,49,13,76,67 (j=3j=3)

27,15,13,49,76,67

******************************分隔线******************************

平衡二叉树是只层数差不超过2层,即为平衡二叉树,小的放左边,大的在右边,相等的无法放入平衡二叉树,注意,要从层数差上判断是否为二叉树.

最多用到二维数组

由一维数组组成的数组叫二维数组.

二维数组的数组元素就是一维数组

格式:

int[][] arr=new int[一维数组的个数][一维数组的元素个数];

for(;;){

for(;;){

}

}

import java.util.*; public class TestTwo { public static void main(String args[]) { int[][] arr1 = new int[2][]; int[][] arr2 = new int[2][2]; // System.out.println(arr1[0][0]); //报错 System.out.println(arr2[0][0]); //0 //arr1分配了二维数组的内存,没有分配一维 //arr2都分配了 for (int i=0;i<arr1.length;i++) { arr1[i] = new int[2]; //由于上面没有对arr1的一维数组分配空间,所以要在这里分配空间 for (int j=0;j<arr1[i].length;j++) { arr1[i][j]=i*j; } } arr2[0]=new int[]{1,2}; //静态初始化 arr2[1]=new int[]{2,3,4}; //重新分配空间 for (int i=0;i<arr1.length;i++) { for (int j=0;j<arr1[i].length;j++) { System.out.print(arr1[i][j]+""); } System.out.println(); } int[][] arr3={{1,2},{3,4}}; //二维数组静态初始化 } }

arr 代表二维数组

arr[0] 代表二维数组的第一个元素(一维数组)

arr[i][j] 代表int,i+1个一维数组里的第j+1个元素.

i 一维数组在二维数组的下标

j 数据在一维数组的下标

/*要求用第一个数组的行乘以第二个数组的列,打印出如下效果: 1 4 9 16 25 36 49 64 81 */ import java.util.*; public class TestTwoEx { public static void main(String args[]) { int[][] arr1={{1,2,3},{4,5,6},{7,8,9}}; int[][] arr2={{1,4,7},{2,5,8},{3,6,9}}; for (int i=0;i<arr1.length;i++) { for (int j=0;j<arr2.length;j++) { System.out.print(arr1[i][j]*arr2[j][i]+" "); } System.out.println(); } } }

******************************分隔线******************************

作业:

1. 今天笔记看一遍,理解.

2. 编程题:

a) 笔记里的选择排序和插入排序

b) 编写五子棋游戏,

i. 注意:取输入坐标时,String

ii. String in=sc.next();

iii. char c1=in.charAt(0);

iv. char c2=in.charAt(1);

******************************分隔线******************************

好吧,今晚又到2点才睡-_-|||快要变熊猫了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值