目录
一、冒泡排序
冒泡排序(Bubble Sorting)
例子:24,69,80,57,13 使用冒泡排序法将其排成一个从小到大的有序数列
第一步:思路
冒泡排序特点总结:
1.一共有5个元素
2.一共进行了4轮排序,可以看成是外层循环
3.每一轮排序确定一个数据的位置,第一轮确定最大数,第二轮排序确定第二大的数,以此类推
4.当进行比较时,如果前面的数大于后面的数,就交换(从小到大)
5.每一轮的比较次数在逐渐减少 4->3->2->1
第二步:代码实现
第一轮排序代码
public class BubbleSort{
//编写一个main方法
public static void main(String[] args){
//化繁为简,先死后活
int[] arr = {24,69,80,57,13};
//第一轮有四次比较
int temp = 0;
for(int j = 0; j < 4; j++){
//如果前面的数大于后面的数,交换两者位置
if(arr[j] > arr[j+1]){
temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
System.out.println("第一轮排序后====");//遍历数组
for(int j = 0; j < arr.length; j++){
System.out.print(arr[j] + "\t");
}
}
}
第二轮代码和第一轮一样,只需更改循环次数即可
进一步精简:4轮排序可以作为一个外循环
内部循环只有每一轮循环的次数不同
i=0时,循环4次
i=1时,循环3次
i=2时,循环2次
i=3时,循环1次
public class BubbleSort{
//编写一个main方法
public static void main(String[] args){
//下面我们举一个具体的案例来说明冒泡法。
//我们将五个无序:24,69,80,57,13 使用冒泡排序法将其排成一个从小到大的有序数列
//依次比较,一共四轮比较
//第一轮进行四次,第二轮3次
int arr[] = {24, 69, 80, 57, 13};
for(int j = 0; j < arr.length - 1; j++){
int temp = 0;
for(int i = 0; i < arr.length - 1 - j; i++){
if(arr[i] > arr[i + 1]){
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
System.out.println("\n=======第" + (j + 1) + "轮排序的结果为====");
for(int i = 0; i < arr.length; i++){
System.out.print(arr[i] + "\t");
}
}
}
}
二、查找
代码
/*
1) 有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王猜数游戏:
从键盘中任意输入一个名称,判断数列中是否包含此名称
【顺序查找】 要求: 如果找到了,就提示找到,并给出下标值
*/
import java.util.Scanner;
public class SeqSearch{
public static void main(String[] args){
String names[] = {"白眉鹰王", "金毛狮王", "紫衫龙王", "青翼蝠王"};
System.out.println("请输入要查找的名字");
Scanner myScanner = new Scanner(System.in);
String findName = myScanner.next();
int index = -1;//经典编程思想
for(int i = 0; i < names.length; i++){
if(names[i].equals(findName)){//字符串的比较
System.out.println("恭喜你,已经找到" + findName);
index = i;
System.out.println("下标为" + index);
break;
}
}
if(index == -1){//当执行此语句时,说明上述循环的if分支中的index = i;
//没有被执行,即数组内没有输入的名字
System.out.println("此数组内没有" + findName);
}
}
}
用到的知识
字符串比较:equals的用法 findName.equals(name[i]);
经典编程技巧 : index = -1;设置一个变量,如果匹配成功将下标赋给此变量,如果如果index = -1仍然成立,说明遍历过后匹配不成功
二维数组
通俗理解:
定义形式:int[][]
一个一维数组的元素本身又是一个一维数组,就这样构成了二维数组
代码:
public class TwoDimensionalArray01{
public static void main(String[] args){
/*
请用二维数组输出如下图形
0 0 0 0 0 0
0 0 1 0 0 0
0 2 0 3 0 0
0 0 0 0 0 0
*/
int[][] arr = { {0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 0},
{0, 2, 0, 3, 0, 0},
{0, 0, 0, 0, 0, 0}};
System.out.println("该二维数组的元素个数为" + arr.length);
System.out.println("该二维数组的第三行第四元素个数为" + arr[2][3]);//数组下标是从零开始的
for(int i = 0; i < arr.length; i++){
for(int j = 0; j < arr[i].length; j++){
System.out.print(arr[i][j] + " ");
}
System.out.print("\n");
}
}
}
总结:
arr[3][3]表示第4个一维数组的第4的元素的值,即0,因为数组的下标是从0开始的
arr[i]表示数组的第i个一维数组,arr[i].length表示第i个一维数组的长度
二维数组使用方式
使用方式1:动态初始化
语法: 类型[][] 数组名=new 类型[大小][大小]
2) 比如: int a[][]=new int[2][3](一个二维数组内有两个一维数组,每个一维数组内有3个元素)
代码:
public class TwoDimensionalArray02{
public static void main(String[] args){
int[][] arr = new int[2][3];
arr[0][2] = 8;//第1个一位数组的第3个元素为8
arr[1][1] = 5;//第2个一维数组的第2个元素为5
//遍历二维数组
for(int i = 0; i < arr.length; i++){
//遍历二维数组内的一维数组
for(int j = 0; j < arr[i].length; j++){
System.out.print(arr[i][j] + " ");//int型变量默认值为0
}
System.out.print("\n");
}
}
}
二维数组在内存中的存在形式(重要!)
使用方式2:动态初始化
先声明:类型 数组名[][];
再定义(开辟空间) 数组名 = new 类型[大小][大小]
赋值(有默认值,比如 int 类型的就是 0)
eg:int arr[][];
arr = new int[2][3];
使用方式3:动态初始化-列数不确定
要求:打印出以上数组
题目分析:一个二维数组,有三个一维数组,但是每个一维数组内元素的数量是不同的,第一个一维数组内有一个元素,第二个有两个元素,第三个有三个元素
代码:
public class TwoDimensionalArray03{
public static void main(String[] args){
int arr[][];
arr = new int[3][];//不确定每个一维数组内有几个元素
for(int i = 0; i < arr.length; i++){
//给每个一维数组开辟一个新的空间
//arr[0]内有1个元素,arr[1]有两个元素,arr[2]有3个元素
arr[i] = new int[i + 1];//如果没有这一步,arr[i]就是null
for(int j = 0; j < arr[i].length; j++){
//arr[0]内的一个元素的值为1;arr[1]内两个元素的值为2,arr[2]内三个元素的值为3
arr[i][j] = i + 1;
System.out.print(arr[i][j] + " ");
}
System.out.print("\n");
}
}
}
使用方式4:静态初始化
int[][] arr = {{1,1,1}, {8,8,9}, {100}};
解读:1)二维数组arr内有3个元素,即3个一维数组;2)第一个一维数组有3个元素,分别为1,1,1;第二个一维数组有3个元素,分别为8,8,9;第三个一维数组有1个元素,值为100;
二维数组练习
第一题:int arr[][]={{4,6},{1,4,5,7},{-2}}; 遍历该二维数组,并得到和
代码
/*int arr[][]={{4,6},{1,4,5,7},{-2}};
遍历该二维数组,并得到和
*/
public class TwoDimensionalArray05{
public static void main(String[] args){
int arr[][]={{4,6},{1,4,5,7},{-2}};
int sum = 0;
for(int i = 0; i < arr.length; i++){
for(int j = 0; j < arr[i].length; j++){
System.out.print(arr[i][j] + " ");
//一轮小循环累计一个一维数组内元素的和,大循环结束后累计为二维数组的和
sum += arr[i][j];
}
System.out.print("\n");
}
System.out.print("此数组的和为" + sum);
}
}
杨辉三角
杨辉三角的形式
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 1
以此类推
规律总结:
1)第n行有n个元素()
2)第一个数字和最后一个数字都是1
3)第三行开始除了首个元素和最后一个元素之外的值的规律:arr[i][j]=arr[i-1][j] +arr[i-1][j-1]
以上三条是打印出杨辉三角的重要条件
代码:
//打印10行杨辉三角
public class YangHui{
public static void main(String[] args){
//杨辉三角的规律
//1)第n行有n个元素()
//2)第一个数字和最后一个数字都是1
//3)第三行开始除了首个元素和最后一个元素之外的值的规律
//:arr[i][j]=arr[i-1][j] +arr[i-1]
int yangHui[][] = new int[10][];
for(int i = 0; i < yangHui.length; i++){
//给每一个一维数组开创空间
yangHui[i] = new int[i + 1];
for(int j = 0; j < yangHui[i].length; j++){
//每一个一维数组的第一个元素和最后一个元素的值为1
if(j == 0 || j == yangHui[i].length - 1){//最后一个元素的下标值为数组长度-1
yangHui[i][j] = 1;
}else{//首尾意外元素的值
yangHui[i][j] = yangHui[i-1][j] + yangHui[i-1][j-1];
}
}
}
//循环遍历输出
for(int i = 0; i < yangHui.length; i++){
for(int j = 0; j < yangHui[i].length; j++){
System.out.print(yangHui[i][j] + " ");
}
System.out.print("\n");
}
}
}
二维数组使用细节和注意事项
1)二维数组的声明方式有: int[][] y 或者 int[] y[] 或者 int y[][]
2)二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不相同(不相同的为列数不相等的二维数组)。
二维数组课堂练习
题目:
声明:int[] x,y[];以下选项能够通过编译的是()
int[] x,y[] 即int[] x;int[] y[]; 其中int[]作用于x和y[]
由此得出x是一维数组,y是二维数组
a) x[0] = y; //将二维数组赋值给一维数组内的一个元素 int[][] -> int
b)y[0] = x; //y是二维数组,y[0]是一维数组,x也是一维数组,此语句正确
c) y[0][0] = x; //int[] -> int 错误
d) x[0][0] = y; //x是二维数组,不存在x[0][0]
e)y[0][0] = x[0]; //都是数组内的元素
f) x = y; //int[][] -> int[]错误