数组与冒泡排序和二分查找
1、数组(一维数组)
可存储多个相同类型的数据的集合,在内存中是一段连续的内存地址
-
数组的创建
//数据类型[] 数组名称 = {数据1,数据2,...,数据n}; int[] nums = {1,2,3,4,5,6}; //数据类型[] 数组名称 = new 数据类型[数组长度]; int nums = new int[10]; //不常用创建方式 int nums = new imt[]{1,2,3,4,5};
-
数组的操作
查询:
//通过下标对具体的数据进行操作 int[] nums = {1,2,3,4,5}; //数组的下标从0开始 System.out.println(nums[0]); //输出结果为1
遍历:
int[ nums = {1,2,3,4,5}; for(int index=0;index<nums.length();index++){ System.out.println(nums[index]); //1,2,3,4,5 }
-
注意的点:
问题一:创建错误 ------------------------------------------------------------- //易错数组创建方式演示 int[] nums; //定义但为初始化 nums = {1,2,3,,4,5}; //该初始化方式只能在定义的时候才能使用 //上述解决办法 int[] nums; nums = new int[5]; ------------------------------------------------------------- 问题二:空指针与数组越界 //空指针 int[] nums; System.out.println(nums[0]); //此时会提示空指针异常 //下标越界 int[] nums = {1,2,3,4,5}; System.out.println(nums[5]); //下标为5表示第六个数,而数组只有5个数,超出数组范围
2、Java冒泡排序
顾名思义,排序即按照从小到大或从大到小的顺序排,冒泡即在形容排序时数据位置的变化,数组中最大的(或最小的)数移动到数组的一端,将数组纵向来看便像是”冒泡“。
冒泡排序代码示例:
public class Demo01 {
public static void main(String[] args) {
int[] nums = {14,22,16,78,30,55,1};
int temp = 0; //作为中间变量,用于交换数组中两个相邻的数据
for(int i=0;i<nums.length-1;i++) { //减1的原因是因为每次循环的交换次数比数组长度少1
for(int j=0;j<nums.length-1-i;j++) { //随着外层循环次数增加,内层循环次数逐渐减少
if(nums[j]>nums[j+1]) {
temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}
//循环遍历数组
for(int i=0;i<nums.length;i++) {
System.out.println(nums[i]);
}
}
}
3、Java二分查找(折半查找)
举个例子,类似于一个猜数字的小游戏:在0-100之间让你猜一个确定的数字,在每次猜完后只有三种回答:大了、小了、猜对了。比方说确定的数字是78,第一次猜一般是猜(0-100)中间的数——50,不管是否正确,至少可以排除掉一半的错误答案,收到的回答是小了,第二次继续猜(50-100)中间的数——75,以此类推,第三次猜(75-100)——87,第四次猜(75-87)——81,第五次猜(75-81)——78。查找完毕!显而易见,在上面的例子中在100个数据中查找一个数据用二分法只需要5次,如果按照顺序查找,平均(正序和逆序)要查找50次;因此在面对一些量比较大的数据时,使用二分查找要更好。
-
前提条件:
-
数组需要是有序的
-
必须使用线性表的顺序存储结构来存储数据
-
-
方法原理
- 需要的变量:
- 范围两端的位置下标(上界和下界)
- 中间值的位置下标
- 步骤概述:
- 每次将所要查询的数据与中间的值进行比较
- 根据上一步的结果移动上界或者下界的位置
- 可能遇到的情况:
- 当下界高于上界时,说明没有这个数据
- 当中间值与所要查询的数据一致时,说明已查询到
- 需要的变量:
-
代码实现:
public class Demo02 { public static void main(String[] args) { int[] nums = {1,2,3,4,5,6,7,8,9,10}; int num = 9; //所要查找的值 //初始化的上下界 int minIndex = 0; int maxIndex = nums.length-1; int centerIndex = (minIndex + maxIndex)/2; while(true) { if(nums[centerIndex] > num) { //中间数大了 maxIndex = centerIndex-1; }else if(nums[centerIndex] < num) { //中间数小了 minIndex = centerIndex+1; }else { //中间数不大不小,找到了!!! break; } if(minIndex > maxIndex) { //没找到,返回-1 centerIndex = -1; break; } centerIndex = (minIndex + maxIndex)/2; } System.out.println(centerIndex); } }
4、多维数组
通俗的说是数组中存放数组
-
多维数组的创建
以二维数组为例:
0,0 0,1 0,2 0,3 0,4 0,5 1,0 1,1 1,2 1,3 1,4 1,5 2,0 2,1 2,2 2,3 2,4 2,5 3,0 3,1 3,2 3,3 3,4 3,5 代码实现:
int[][] nums = new int[4][6]; //如上图所示,定义了一个4行5列的二维数组