第四天-数组、排序

2.8.3 数组操作常见问题
1,越界
2,空指针


获取数组中的元素。


数组有length属性,求数组长度。


定义数组:
1、静态初始化:
int arr[] = {1,2,3};




2、动态初始化:
int arr[] = new int[3];




非法:
int arr[] = new int[3];
arr = {1,2,3};


因为arr指向的是地址。


合法:
int arr[] = new int[3];
arr[0]=1;
arr[1]=2;
arr[2]=3;




2.8.4数组常见操作


给定数组求最大值:


public static int getMax(int[] arr){
		int max = arr[0];
		for(int x=1; x<arr.length; x++){
			if(arr[x]>max)
				max = arr[x];
		}
		return max;
	}


max初始化不能等于0,因为当数组元素都是负数时,最后结果是0最大,但0不是数组元素。


当max为数组元素角标时,可以初始化为0.
public static int getMax(int[] arr){
		int max = arr[0];
		for(int x=1; x<arr.length; x++){
			if(arr[x]>arr[max])
				max = x;
		}
		return arr[max];
	}






数组排序:
最快排序算法:希尔排序


Java自带有排序方法:Array.sort();


1、选择排序:选择一个值跟其他值依次比较。
内循环结束一次之后,最值出现在头角标处。
public static void selectSort(int[] arr){
		//int temp = arr[0];
		for(int x=0; x<arr.length-1; x++){
			for(int y=x+1; y<arr.length; y++){
				if(arr[x] > arr[y]){
						int temp = arr[x];
						arr[x] = arr[y];
						arr[y] = temp;
					}
			}
		}
	}




2、冒泡排序:相邻的两个元素进行比较,如果符合条件就换位。
内循环结束一次之后,最值出现了最后角标位置。


public static void bubbleSort(int[] arr){
		for(int x=0; x<arr.length-1; x++){
			for(int y=0; y<arr.length-x-1; y++){//-x:让每一次比较元素减少,-1:避免数组越界。
				if(arr[y]>arr[y+1]){
					int temp;
					temp = arr[y];
					arr[y] = arr[y+1];
					arr[y+1] = temp;
				}
			}
		}
	}




无论什么排序方式,都需要对满足条件的元素进行位置置换。
所以可以把这部分相同代码提取出来,单独封装成一个函数。
public static void swap(int[] arr,int a,int b){
		int temp;
		temp = arr[a];
		arr[a] = arr[b];
		arr[b] = temp;
	}






数组的查找操作。
public static int getIndex(int[] arr, int key){
		for(int x=0; x<arr.length; x++){
			if(arr[x]==key)
				return x;
		}
		return -1;//因为数组下标没有-1,所以一般用-1表示没结果。
	}



折半查找:可以提高查找效率,但是数组必须是有序数组。
public static int halfSearch(int[] arr,int key){
		int min,mid,max;
		min = 0;
		max = arr.length-1;
		mid = (min+max)/2;
		
		while(arr[mid]!=key){
			if(key>arr[mid])
				min = mid + 1;
			else if(key<arr[mid])
				max = mid - 1;
			
			if(min>max)
				return -1;//找不到结果的时候。


			mid = (max+min)/2;
			
		}
		return mid;
	}



折半的第二种方式:


public static int halfSearch_2(int arr[],int key){
		int min = 0,max = arr.length-1,mid;
		
		while(min<max){
			mid = (min+max)/2;
			if(key>arr[mid])
				min = mid + 1;
			else if(key<arr[mid])
				max = mid - 1;
			else
				return mid;
		}
			return -1;
	}




练习:有一个有序数组,如果将一个元素插入到该数组中,
还要保持该数组是有序的,如何获取该元素在数组中的位置。


十进制—>二进制
十进制—>十六进制
查表法:将所有元素临时存储起来。建立对应关系。
每一次&15后的值作为索引去查建立好的表。就可以找到对应的元素。
可以通过数组的形式定义这个表。 


2.8.5二维数组 
 int[] x,y[];//x一维,y二维
相当于:
int[] x;
int[] y[];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值