数组 排序

1. 数组

1.1 数组介绍

数组可以存放多个同一类型的数据。数组也是一种数据类型,是引用类型。 即:数(数据)组(一组)就是一组数据

1.2 数组的使用

使用方式1-动态初始化数组的定义
        数据类型数组名[ ]  = new 数据类型 [大小] 
        int a[ ] = new int[5]; //创建了一个数组,名字a,存放5个int
        说明:这是定义数组的一种方法。

使用方式2-动态初始化
        
先声明数组 语法:数据类型 数组名[];   也可以 数据类型[] 数组名;
                 int a[ ]; 或者 int[ ] a;
        创建数组
                语法: 数组名=new 数据类型[大小];
                 a=new int[10];        

使用方式3-静态初始化  
        初始化数组
        语法: 数据类型数组名[ ] = {元素值,元素值...}
        int a[ ] = {2.5,6.7,8,89.90,34,56}

1.3 数组使用注意事项

1) 数组是多个相同类型数据的组合,实现对这些数据的统一管理
2) 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用。
3) 数组创建后,如果没有赋值,有默认值 int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char         \u0000,boolean false,String null
4) 使用数组的步骤 1. 声明数组并开辟空间 2 给数组各个元素赋值 3 使用数组
5) 数组的下标是从0开始的。
6) 数组下标必须在指定范围内使用,否则报:下标越界异常,比如
        int [ ] arr=new int[5]; 则有效下标为 0-4
7) 数组属引用类型,数组型数据是对象(object

 //1. 数组是多个相同类型数据的组合,实现对这些数据的统一管理
//int[] arr1 = {1, 2, 3, 60,"hello"};//String->int
 double[] arr2 = {1.1, 2.2, 3.3, 60.6, 100};//int->double
 //2. 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用
String[] arr3 = {"北京","jack","milan"};
 //3. 数组创建后,如果没有赋值,有默认值
//int
 0,short 0, byte 0, long 0,
 //float 0.0,double 0.0,char \u0000,
//boolean false,String null
 //
 short[] arr4 = new short[3];
 System.out.println("=====数组 arr4=====");
 for(int i = 0; i < arr4.length; i++) {
 System.out.println(arr4[i]);
 }
//6.数组下标必须在指定范围内使用,否则报:下标越界异常,比如
//int[]arr=newint[5];则有效下标为0-4
 //即数组的下标/索引最小0最大数组长度-1(4)
 int[]arr=newint[5];
 //System.out.println(arr[5]);//数组越界

1.4 数组赋值机制

1) 基本数据类型赋值,这个值就是具体的数据,而且相互不影响。 int n1 = 2; int n2 = n1;
2) 数组在默认情况下是引用传递,赋的值是地址。

1.5 数组拷贝

将 int[] arr1 = {10,20,30}; 拷贝到 arr2 数组, 要求数据空间是独立的:

 //将 int[] arr1 = {10,20,30}; 拷贝到 arr2 数组,
 //要求数据空间是独立的.
 int[] arr1 = {10,20,30};
 //创建一个新的数组arr2,开辟新的数据空间
//大小 arr1.length;
 int[] arr2 = new int[arr1.length];
 //遍历 arr1 ,把每个元素拷贝到arr2对应的元素位置
for(int i = 0; i < arr1.length; i++) {
 arr2[i] = arr1[i];
 }
 //修改 arr2, 不会对arr1有影响.
 arr2[0] = 100;
 //输出arr1
 System.out.println("====arr1 的元素====");
 for(int i = 0; i < arr1.length; i++) {
 System.out.println(arr1[i]);//10,20,30
 }
 System.out.println("====arr2的元素====");
 for(inti=0;i<arr2.length;i++){
 System.out.println(arr2[i]);
 }
 

1.6 数组反转

要求:把数组的元素内容反转 :  arr {11,22,33,44,55,66} {66,55,44,33,22,11}

 //定义数组
int[]arr={11,22,33,44,55,66};
 //思路
//规律
//1.把arr[0]和arr[5]进行交换{66,22,33,44,55,11}
//2. 把 arr[1] 和 arr[4] 进行交换 {66,55,33,44,22,11}
 //3. 把 arr[2] 和 arr[3] 进行交换 {66,55,44,33,22,11}
 //4. 一共要交换 3 次 =arr.length/2
 //5. 每次交换时,对应的下标 是 arr[i] 和 arr[arr.length-1-i]
 //代码
//优化
int temp = 0;
 int len = arr.length; //计算数组的长度
for( int i = 0; i < len / 2; i++) {
 temp = arr[len- 1- i];//保存
arr[len- 1- i] = arr[i];
 arr[i] = temp;
 }
 System.out.println("===翻转后数组===");
 for(int i = 0; i < arr.length; i++) {
 System.out.print(arr[i] + "\t"); //66,55,44,33,22,11
 }

1.7 数组添加/扩容

要求:实现动态的给数组添加元素效果,实现对数组扩容。
1) 原始数组使用静态分配int[]arr={1,2,3}
2) 增加的元素4,直接放在数组的最后arr={1,2,3,4}
3) 用户可以通过如下方法来决定是否继续添加,添加成功,是否继续?y/n

 /* 思路分析
1. 定义初始数组 int[]arr={1,2,3}//下标 0-2
 2. 定义一个新的数组 int[]arrNew=newint[arr.length+1];
 3. 遍历 arr 数组,依次将arr的元素拷贝到 arrNew数组
4. 将 4 赋给 arrNew[arrNew.length- 1] = 4;把 4 赋给arrNew 最后一个元素
5. 让 arr 指向 arrNew; arr=arrNew; 那么 原来arr数组就被销毁
6. 创建一个 Scanner可以接受用户输入
7. 因为用户什么时候退出,不确定,老师使用 do-while+break来控制
*/
Scanner myScanner = new Scanner(System.in);
//初始化数组
 int[] arr = {1,2,3};
 do {
 int[] arrNew = new int[arr.length + 1];
//遍历 arr 数组,依次将arr的元素拷贝到 arrNew数组
for(int i = 0; i < arr.length; i++) {
 arrNew[i] = arr[i];
 }
 System.out.println("请输入你要添加的元素");
 int addNum = myScanner.nextInt();
 //把 addNum 赋给arrNew 最后一个元素
arrNew[arrNew.length- 1] = addNum;
 //让 arr 指向 arrNew,
 arr = arrNew;
 //输出arr 看看效果
System.out.println("====arr 扩容后元素情况====");
 for(int i = 0; i < arr.length; i++) {
 System.out.print(arr[i] + "\t");
 }
 //问用户是否继续
System.out.println("是否继续添加 y/n");
 char key = myScanner.next().charAt(0);
 if( key == 'n') { //如果输入 n ,就结束
break;
 }
 }while(true);
 System.out.println("你退出了添加...");
 }

 /*
请用二维数组输出如下图形
0 0 0000
 0 0 1000
 0 2 0300
 0 0 0000
 */
//什么是二维数组:
//1. 从定义形式上看 int[][]
 int[][] arr = { {0, 0, 0, 0, 0, 0},
 //2. 可以这样理解,原来的一维数组的每个元素是一维数组, 就构成二维数组
{0, 0, 1, 0, 0, 0},
 {0,2, 0, 3, 0, 0},
 {0, 0, 0, 0, 0, 0} };

 //关于二维数组的关键概念
//(1)
System.out.println("二维数组的元素个数="+arr.length);
 //(2)二维数组的每个元素是一维数组,所以如果需要得到每个一维数组的值
//还需要再次遍历
//(3)如果我们要访问第(i+1)个一维数组的第j+1个值arr[i][j];
 //举例访问3,=》他是第3个一维数组的第4个值arr[2][3]
 System.out.println("第3个一维数组的第4个值="+arr[2][3]);//3
 
//输出二维图形
for(inti=0;i<arr.length;i++){//遍历二维数组的每个元素
//遍历二维数组的每个元素(数组)
//1.arr[i]表示二维数组的第i+1个元素比如arr[0]:二维数组的第一个元素
//2.arr[i].length得到对应的每个一维数组的长度
for(intj=0;j<arr[i].length;j++){
 System.out.print(arr[i][j]+"");//输出了一维数组
}
 System.out.println();//换行
}

1.8 多维数组-二维数组

1.8.1 使用方式1:动态初始化

1) 语法:类型[ ][ ]数组名 = new类型[大小][大小]
2) 比如:inta[ ][ ] = newint [2][3]

 //intarr[][]=newint[2][3];
 intarr[][];//声明二维数组
arr=newint[2][3];//再开空间
arr[1][1]=8;
 //遍历arr数组
for(inti=0;i<arr.length;i++){
 for(intj=0;j<arr[i].length;j++){//对每个一维数组遍历
System.out.print(arr[i][j]+"");
 }
 System.out.println();//换行
}}

1.8.2 使用方式2: 动态初始化

先声明:类型 数组名[ ][ ];
再定义(开辟空间) 数组名 = new 类型[大小][大小]
赋值(有默认值,比如int 类型的就是0)

1.8.3 使用方式3: 动态初始化-列数不确定

 /*
看一个需求:动态创建下面二维数组,并输出
i = 0: 1
 i = 1: 2 2
 i = 2: 3 3 3
一个有三个一维数组, 每个一维数组的元素是不一样的
*/
 //创建 二维数组,一个有3个一维数组,但是每个一维数组还没有开数据空间
int[][] arr = new int[3][];
 for(int i = 0; i < arr.length; i++) {//遍历 arr 每个一维数组
//给每个一维数组开空间 new
 arr[i] = new int[i + 1];
 //如果没有给一维数组 new,那么 arr[i]就是null
 //遍历一维数组,并给一维数组的每个元素赋值
for(int j = 0; j < arr[i].length; j++) {
 arr[i][j] = i + 1;//赋值
}
}
 System.out.println("=====arr元素=====");
 //遍历arr输出
for(inti=0;i<arr.length;i++){
 //输出arr的每个一维数组
for(intj=0;j<arr[i].length;j++){
 System.out.print(arr[i][j]+"");
 }
 System.out.println();//换行
}}

1.8.4 使用方式4:静态初始化

定义 类型 数组名[ ][ ] = {{值1,值2..},{值1,值2..},{值1,值2..}}
使用即可[固定方式访问]
比如:  int[ ][ ]arr = {{1,1,1},{8,8,9},{100}};

1.8.5 二维数组使用细节和注意事项

1)一维数组的声明方式有: int[ ]x 或者 int x[ ]
2)二维数组的声明方式有: int[ ][ ] y或者int[ ]y[ ]或者int y[ ][ ]
3)二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不相同。比如:map[ ][ ]是 一个二维数组 int map[ ][ ] = {{1,2},{3,4,5}}
由map[0]是一个含有两个元素的一维数组,map[1]是一个含有三个元素的一维数组构成,我们也称为列数不等 的二维数组

2. 排序

2.1 排序的介绍

排序是将多个数据,依指定的顺序进行排列的过程。 排序的分类:

2.1.1 内部排序:

        指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法、选择 式排序法和插入式排序法);

2.1.2 外部排序法:

        数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)。

2.2 冒泡排序法

        冒泡排序(BubbleSorting)的基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素 的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒

总结冒泡排序特点:
1. 我们一共有5个元素
2. 一共进行了4轮排序,可以看成是外层循环
3. 每1轮排序可以确定一个数的位置,
        比如第1轮排序确定最大数,第2轮排序,确定第2大的数位置,依次类推
4. 当进行比较时,如果前面的数大于后面的数,就交换
5. 每轮比较在减少 4 -> 3 -> 2 -> 1 分析思路->代码..

 int[] arr = {24, 69, 80, 57, 13,-1, 30, 200,-110};
 int temp = 0; //用于辅助交换的变量
//将多轮排序使用外层循环包括起来即可
//先死后活 =》 4就是 arr.length-1
 for( int i = 0; i < arr.length- 1; i++) {//外层循环是 4 次
for( int j = 0; j < arr.length- 1- i; j++) {//4 次比较-3 次-2 次-1 次
//如果前面的数>后面的数,就交换
if(arr[j] > arr[j + 1]) {
 temp = arr[j];
 arr[j] = arr[j+1];
 arr[j+1] = temp; }
 } 
System.out.println("\n==第"+(i+1)+"轮==");
 for(int j = 0; j < arr.length; j++) {
 System.out.print(arr[j] + "\t");

 // for( int j = 0; j < 4; j++) {//4 次比较
 // }
 //如果前面的数>后面的数,就交换
//if(arr[j] > arr[j + 1]) {
 //temp = arr[j];
// arr[j] = arr[j+1];
 //arr[j+1] = temp;
 //}
 // System.out.println("==第 1 轮==");
 // for(int j = 0; j < arr.length; j++) {
 // }
 // /*
 // System.out.print(arr[j] + "\t");
 // 第2轮排序: 目标把第二大数放在倒数第二位置
// 第1次比较[24,69,57,13,80]
 // 第2次比较[24,57,69,13,80]
 // 第3次比较[24,57,13,69,80]
 // for( int j = 0; j < 3; j++) {//3 次比较
 //如果前面的数>后面的数,就交换


 //if(arr[j] > arr[j + 1]) {
 //temp = arr[j];
 //arr[j] = arr[j+1];
 //arr[j+1] = temp;
 // }
 // System.out.println("\n==第 2 轮==");
 // for(int j = 0; j < arr.length; j++) {
  //  System.out.print(arr[j] + "\t");
 // }

 // 第3轮排序: 目标把第3大数放在倒数第3位置
// 第1次比较[24,57,13,69,80]
 // 第2次比较[24,13,57,69,80

 // for( int j = 0; j < 2; j++) {//2 次比较
//如果前面的数>后面的数,就交换
//if(arr[j] > arr[j + 1]) {
//temp = arr[j];
 //arr[j] = arr[j+1];
 //arr[j+1] = temp;
 // }

// System.out.println("\n==第 3 轮==");
 // for(int j = 0; j < arr.length; j++) {
 //System.out.print(arr[j] + "\t");
 // }

 // 第4轮排序: 目标把第4大数放在倒数第4位置
// 第1次比较[13,24,57,69,80]
 // for( int j = 0; j < 1; j++) {//1 次比较
 //如果前面的数>后面的数,就交换
//if(arr[j] > arr[j + 1]) {
// temp = arr[j];
// arr[j] = arr[j+1];
// arr[j+1] = temp;

 // System.out.println("\n==第 4 轮==");
 // for(int j = 0; j < arr.length; j++) {
// System.out.print(arr[j] + "\t");
 // }

2.3 查找

2.3.1 介绍:

1)顺序查找        2)二分查找

 /*
顺序查找

有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王猜数游戏:
从键盘中任意输入一个名称,判断数列中是否包含此名称【顺序查找】
要求:如果找到了,就提示找到,并给出下标值
思路分析
1.定义一个字符串数组
2.接收用户输入,遍历数组,逐一比较,如果有,则提示信息,并退出
*/
//定义一个字符串数组
String[] names = {"白眉鹰王", "金毛狮王", "紫衫龙王", "青翼蝠王"};
 Scanner myScanner = new Scanner(System.in);
 System.out.println("请输入名字");
 String findName = myScanner.next();
 //遍历数组,逐一比较,如果有,则提示信息,并退出
//这里老师给大家一个编程思想/技巧, 一个经典的方法
int index =-1;
 for(int i = 0; i < names.length; i++) {
 //比较 字符串比较 equals, 如果要找到名字就是当前元素
if(findName.equals(names[i])) {
 System.out.println("恭喜你找到 " + findName);
 System.out.println("下标为= " + i);
 //把 i 保存到 index
 index = i;
 break;//退出
}
 }
 if(index ==-1) { //没有找到
System.out.println("sorry ,没有找到 " + findName);
 }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值