数组
1.数组的定义
2.数组常见格式
3.数组其他格式
4.数组常见问题
5.数组中寻找最值及三目运算符的使用
6.数组中的两个算法
6.1冒泡排序
6.1.1命名由来
6.1.2原理
6.1.3具体代码
6.2二分查找
6.2.1概述
6.2.2 原理
6.2.3 具体代码
1.数组的定义
数组是相同数据类型的多个数据的容器。
这些元素按线性顺序排列。所谓线性顺序是指除第一个元素外,每一个元素都有唯一的前驱元素;
除最后一个元素外,每一个元素都有唯一的后继元素。(就是一个一个的按顺序排列)
2.数组常见格式
public class Arrayformat {
public static void main(String[] args) {
//创建数组的格式
//常用格式1:创建数组的同时,制定数组的内容
// 数据类型[] 数组名称 = {数据1,数据2,数据3...数据n};
int[] ages = {10,11,12,13,14};
//常用格式2:创建数组,并指定长度,不指定数组中的内容。
// 数据类型[] 数组名称 = new 数据类型[数组长度];
// 数组长度通过int数据指定
int[] ages2 = new int[10];
/*
int[] str = new int[11]; //创建了定义长度的数组
str[2] = 1; //给该数组的第三个元素赋值
System.out.println(str[2]); //得到该数组的第三个元素的值
int L = str.length //得到数组长度
*/
//通过下标操作数组数据的方式:
//1. 给数组某个下标赋值: 数组名称[下标] = 值;
ages[0] =100;
//2. 从数组某个下标取值: 数组名称[下标]
System.out.println(ages[0]);
ages2[0] = 99;
System.out.println(ages2[0]);
System.out.println("------------------");
//如何获取数组长度: 数组名称.length
//数组的遍历
for(int index=0;index<ages.length;index++) {
//index: 0 1 2 3 4
System.out.println(ages[index]);
}
}
}
3.数组其他格式
public class Arrayformat1 {
public static void main(String[] args) {
// 数组不常用的创建方式:
//1. 创建数组,不初始化
//格式: 数据类型[] 数组名;
int[] nums;
//2. 创建数组,并指定数组中的内容
//格式: 数据类型[] 数组名称 = new 数据类型[]{内容1,内容2,内容3...内容n};
int[] ages = new int[] {11,12,13,14};
}
}
4.数组常见问题
public class Arrayproblem {
public static void main(String[] args) {
// 常见问题:
// 1. 数组下标越界问题(下标从零开始):
/*int[] nums = {10,11,12,13,14};
// 0 1 2 3 4
System.out.println(nums[5]);//此时下标为5的元素不存在,会导致后面的程序崩溃
*/
// 2. 空指针问题
int[] nums = null;
System.out.println(nums);
}
}
5.数组中寻找最值及三目运算符的使用
public class searchnum {
//寻找数组中的最大值 | 最小值
public static void main(String[] args) {
int[] nums = {10,11,14,56,89,32,0,300,-99};
int n=nums[0];
int m=nums[0];
for(int i=1;i<nums.length;i++) {
n= n>nums[i]?n:nums[i];//三目运算符 比较n和第i个数组元素大小,若n大为n,反之为该元素
m= m<nums[i]?m:nums[i];//三目运算符 比较m第i个数组元素大小,若m小为m,反之为该元素
}
System.out.println("最大值是"+n);
System.out.println("最小值是"+m);
}
}
6.数组中的一些算法
6.1冒泡排序
6.1.1命名由来:
最小(或最大)的元素会经由交换慢慢“浮”到数列的顶端(降序或升序), 就如同水中的气泡最终会上浮到顶端一样,故名“冒泡排序”。
6.1.2原理:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会
是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
升序排列的口诀:
N个数字来排队,两两相比小靠前.外层循环length-1,内层循环length-i-1
降序排序的口诀:
N个数字来排队 ,两两相比大靠前.外层循环length-1,内层循环length-i-1
6.1.3具体代码:
public class BubbleSorting {
//用冒泡排序的方法实现数组的排序
public static void main(String[] args) {
int[] nums = {25,32,54,11,1,56};
// 外层循环控制的是,比较的轮数。
//外层循环次数:length-1
for(int i=0;i<nums.length-1;i++) {
//内层循环控制的是,每轮比较次数
//第i轮(i从0开始计算),比较次数为:length-i-1
for(int j=0;j<nums.length-i-1;j++) {
if(nums[j]>nums[j+1]) {
//俩俩相比,满足移动条件
int 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]);
}
}
}
6.2二分查找
6.2.1 概述:
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,二分查找要求数组数据必须采用顺序存储结构有序排列。
6.2.2原理(假设升序排列):
1.确定查找范围: 最小下标到最大下标
2.计算中间下标: (最小+最大)/2
3.比较中间下标数据: 中间数据较大,则最大下标等于中间下标—1;
中间数据较小,则最小下标等于中间下标+1.
4.当最小下标大于最大下标时,说明数据是不存在的。
6.2.3具体代码:
public class binarysearch{
//二分查找的前提是该数组是按大小顺序排列
public static void main(String[] args) {
int[] nums = {10,20,30,40,50,60,70,90,10};
//输入要查找的数据
Scanner input= new Scanner(System.in);
System.out.println("请输入要查找的数字:");
int num =input.nextInt();
//最小范围下标
int minIndex = 0;
//最大范围下标
int maxIndex = nums.length-1;
//中间数据下标
int centerIndex =(minIndex+maxIndex)/2;
while(true) {
System.out.println("循环了一次");
if(nums[centerIndex]>num) {
//中间数据较大
maxIndex = centerIndex-1;
}else if(nums[centerIndex]<num) {
//中间数据较小
minIndex = centerIndex+1;
}else {
//找到了数据,数据位置:centerIndex
break;
} //当输入错误时,将中间指针赋值为-1
if(nums[minIndex]>nums[maxIndex]) {
centerIndex=-1;
break;
}
//当边界发生了变化,需要更新中间下标
centerIndex = (minIndex+maxIndex)/2;
}
System.out.println("位置:"+centerIndex);
}
}