数组常见的问题,数组的初始化方式,排序算法,二分查找法
数组中最常见的问题:
1. NullPointerException 空指针异常
原因: 引用类型变量没有指向任何对象,而访问了对象的属性或者是调用了对象的方法。\
2. ArrayIndexOutOfBoundsException 索引值越界。
原因:访问了不存在的索引值。
错误演示:
演示二:
数组分析图:
数组的初始化方式:
动态初始化:
数据类型[] 变量名 = new 数据类型[长度];
静态初始化:
数据类型[] 变量名 = {元素1,元素2.....};
如果程序一开始你就已经确定了数据,那么这时候建议使用静态初始化。如果
数据一开始还不太明确,这时候就建议使用动态初始化。
示例代码:
//静态初始化
int[] arr = {10,20,30,40,50};
for(int index = 0 ; index<arr.length ; index++){
System.out.print(arr[index]+",");
结果:
需求: 定义一个函数接收一个int类型的数组对象,找出数组对象中 的最大元素返回给调用者。
代码:
public class Demo17 {
public static void main(String[] args) {
int[] arr = {-12,-14,-5,-26,-4};
int max = getMax(arr);
System.out.println("最大值:"+ max);
}
public static int getMax(int[] arr){
int max = arr[0]; //用于记录最大值
for(int i = 1 ; i < arr.length ; i++){
if(arr[i]>max){ //如果发现有元素比max大,那么max变量就记录该元素。
max = arr[i];
}
}
return max;
}
}
结果:
找出最大值的分析图:
选择排序思路图:
把最大值放在第一位:
代码:
for (int j = 0; j < arr.length - 1; j++) { // 控制的是轮数。
for (int i = j + 1; i < arr.length; i++) { // 找出最大值
if (arr[i] > arr[j]) {
//交换位置
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
结果:
不同排序的代码集:
public class Demo18 {
public static void main(String[] args) {
int[] arr = {12,5,17,8,9}; //对于5元素的数组,只需要找出4个最大值就可以排序了。
selectSort(arr);
}
public static void selectSort(int[] arr) {
/* //把最大值放在首位置。
for (int j = 0; j < arr.length - 1; j++) { // 控制的是轮数。
for (int i = j + 1; i < arr.length; i++) { // 找出最大值
if (arr[i] > arr[j]) {
//交换位置
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
//把老二放在第二个位置
for(int i = 2 ; i< arr.length ; i++){
if(arr[i]>arr[1]){
int temp = arr[i];
arr[i] = arr[1];
arr[1] = temp;
}
}
//把老三放在第三个位置
for(int i = 3 ; i< arr.length ; i++){
if(arr[i]>arr[2]){
int temp = arr[i];
arr[i] = arr[2];
arr[2] = temp;
}
}
*/
//把老四放在第四个位置
for(int i = 4 ; i< arr.length ; i++){
if(arr[i]>arr[3]){
int temp = arr[i];
arr[i] = arr[3];
arr[3] = temp;
}
}
//遍历数组,查看效果
System.out.print("目前的元素:");
for (int i = 0 ; i<arr.length ;i++){
System.out.print(arr[i]+",");
}
}
}
把老四放在第四位的效果图:
需求: 定义一个函数接收一个int类型的数组对象, 把数组中的最大值放在数组中的最后一位。
冒泡排序:冒泡排序的思想就是使用相邻的两个 元素挨个比较一次,符合条件交换位置。
冒泡排序图:
代码:
public static void bubbleSort(int[] arr){
// 把最大值放在最后一个位置
for(int j = 0 ; j<arr.length-1 ; j++){ //控制轮数
for(int i = 0 ; i<arr.length-1-j ; i++){ // 找出一个最大值
//相邻的元素比较
if(arr[i]>arr[i+1]){
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
}
结果:
冒泡排序其他代码:
public class Demo19 {
public static void main(String[] args) {
int[] arr = {12,8,17,5,9}; // 最大的索引值: 4 容量:5
bubbleSort(arr);
}
public static void bubbleSort(int[] arr){
// 把最大值放在最后一个位置
for(int j = 0 ; j<arr.length-1 ; j++){ //控制轮数
for(int i = 0 ; i<arr.length-1-j ; i++){ // 找出一个最大值
//相邻的元素比较
if(arr[i]>arr[i+1]){
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
}
/*
//把老二放在倒数第二个位置上。
for(int i = 0 ; i <arr.length-1-1 ; i++){
if(arr[i]>arr[i+1]){
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
//把老三放在倒数第三个位置上。
for(int i = 0 ; i <arr.length-1-2 ; i++){
if(arr[i]>arr[i+1]){
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
//把老四放在倒数第四个位置上。
for(int i = 0 ; i <arr.length-1-3 ; i++){
if(arr[i]>arr[i+1]){
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
*/
//遍历数组,查看效果
System.out.print("目前的元素:");
for (int i = 0 ; i<arr.length ;i++){
System.out.print(arr[i]+",");
}
}
}
把老四放在倒数第四个位置上运行结果:
需求:定义一个函数接收一个数组对象和一个要查找的目标元素,函数要返回该目标元素在
数组中的索引值,如果目标元素不存在数组中,那么返回-1表示。
折半查找法(二分法): 使用前提必需是有序的数组。
折半查找分析图:
代码:
public class Demo20 {
public static void main(String[] args) {
int[] arr = {12,16,19,23,54};
int index = searchEle(arr,23);
System.out.println("元素所在的索引值是:"+ index);
}
public static int searchEle(int[] arr, int target){
for(int i = 0 ; i<arr.length ; i++){
if(arr[i]==target){
return i;
}
}
return -1;
}
}
结果:
class Demo20
{
public static void main(String[] args)
{
int[] arr = {12,16,19,23,54};
//int index = searchEle(arr,23);
int index = halfSearch(arr,116);
System.out.println("元素所在的索引值是:"+ index);
}
public static int halfSearch(int[] arr, int target){
//定义三个变量分别记录最大、最小、中间的查找范围索引值
int max = arr.length-1;
int min = 0;
int mid = (max+min)/2;
while(true){
if(target>arr[mid]){
min = mid+1;
}else if(target<arr[mid]){
max = mid -1;
}else{
//找到了元素
return mid;
}
//没有找到的情况
if (max<min){
return -1;
}
//重新计算中间索引值
mid = (min+max)/2;
}
}
public static int searchEle(int[] arr, int target){
for(int i = 0 ; i<arr.length ; i++){
if(arr[i]==target){
return i;
}
}
return -1;
}
}
结果: