一、找出数组中最大元素
public static int max(int[]array) {
if(array==null||array.length==0)
//防止传过来的引用变量没有指向变量或者指向的对象里没有东西
{
return -1;
}
int max=array[0];
for(int i=1;i< array.length;i++)
{
if(max<array[i])
{
max=array[i];
}
}
return max;
}
public static void main(String[] args) {
int[]arr={
12,9,13,1,0};
int b=max(arr);
System.out.println(b);
}
二、数组中指定元素的查找
法一:顺序查找,暴力遍历
public static int find(int[]array,int key) {
//array是要查找的数组、key是要查的元素
for(int i=0;i<array.length;i++)
{
if(array[i]==key)
{
return i;
}
}
return -1;//没找到
}
public static void main(String[] args) {
int []arr={
1,9,6,5,7};
System.out.println(find(arr,6));
System.out.println(find(arr,0));
}
法二:二分法查找
public static void find(int[]arr,int key) {
int left=0;
int right= arr.length-1;
while(left<right)
{
int mid = (left + right) / 2;//这里如果本行放在while外,那么mid会一直=(0+9)/2=4,进行一次查找后arr[4]=5<7,left=mid+1=5。left=5<9=right进入循环,arr[4]=5<7...以此循环下去,arr[mid]会永远小于k
//上一行放while里面是为了,每进行一次循环,都可以重新定义mid
if (arr[mid] < key)
{
left = mid+1;//arr[mid]<k,说明下标mid在k下标的左边,那么下一次查找应该在mid右边开始查,所以mid+1
}
else if (arr[mid] > key)
{
right = mid-1;//arr[mid]>k,说明下标mid在k下标的右边,那么下一次查找应该在mid左边开始查,所以mid-1
}
else//mid=k时候
{
System.out.println("找到了,数"+key+"位置为"+"arr["+mid+"]");
break;//这里因为while条件是left<=right,当恰巧找到的最后一个数是要找的数,left=right=(left+right)/2=mid,这是会while一直循环下去,找到后要break跳出循环
}
}
if (left > right)
{
System.out.println("没有数"+key);
}
}
public static void main3(String[] args) {
int []arr={
1,9,6,5,7};
find(arr,6);
find(arr,0);
}
四、检查数组的有序性
public static boolean isUp(int[]arr) {
for(int i=0;i<arr.length-1;i++)
{
//这里i<arr.length-1是因为数组最后一个数下标是length-1,如果和arr.length比较是非法访问
if(arr[i]>arr[i+1])
{
return false;
}
}
return true;
}
public static void main(String[] args) {
int []arr={
11,12,3,15,16};
boolean f=isUp(arr);
System.out.println(f);
int []brr={
1,2,3,4,5};
boolean e=isUp(brr);
System.out.println(e);
}
五、数组(冒泡)排序
public static void bubbleSort(int[]arr) {
for(int i=0;i<arr.length-1;i++)
{
for(int j=0;j<arr.length-1-i;j++)
{
if(arr[j]>arr[j+1])
{
int tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
}
}
public static void main(String[] args) {
int []array={
11,26,7,18,9,0};
bubbleSort(array);
System.out.println(Arrays.toString(array));
}
六、数组元素的逆置比如1357->7531
public static void nz(int[]arr) {
int i=0;
int j=arr.length-1;
while(i<j)
{
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
i++;
j--;
}
}
public static void main(String[] args) {
int []arr={
1,3,5,7};
nz(arr);
System.out.println(Arrays.toString(arr));
}
七、数组数字排列
整形数组,偶数放在前半部分,奇数放在后半部分
public static void change(int[]arr) {
int i=0;
int j= arr.length-1;
while(i<j)
{
while(i<j&&arr[i]%2==0)
{
i++;
}//走完while arr[i]为奇数
while(i<j&&arr[j]%2!=0)
{
j--;
}//走完while arr[j]为偶数
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
public static void main(String[] args) {
int[]arr={
1,2,3,4,5,6};
change(arr);
System.out.println(Arrays.toString(arr));
}
八、数组拷贝
一般方法:
public static int[] copy1(int[]arr) {
int []copy=new int[arr.length];
for(int i=0;i<arr.length;i++)
{
copy[i]=arr[i];
}
return copy;
}
public static void main(String[] args) {
int []arr={
1,2,3,4,5};
int []brr=copy1(arr);
System.out.println(Arrays.toString(arr));
}
调用java原有方法:
public static void main(String[] args) {
int []arr={
0,9,1,4,5};
int []brr=Arrays.copyOf(arr,arr.length);
//第一个参数是被拷贝的数组,第二个参数是拷贝的长度,返回值类型int[]
System.out.println(Arrays.toString(brr));//打印[0, 9, 1, 4, 5]
int []crr=Arrays.copyOfRange(arr,1,3);//从arr下标1开始拷贝到下标3,左闭右开区间[1,3)
System.out.println(Arrays.toString(crr));//打印[9,1]
int []drr=new int[arr.length];
System.arraycopy(arr,0,drr,0,arr.length);
//第一个参数:原数组 第二个参数:从原数组下标哪里开始拷贝 第三个参数:从目标数组哪个位置拷贝进 第四个参数,拷贝长度
System.out.println(Arrays.toString(drr));//打印[0, 9, 1, 4, 5]
int []err=arr.clone();//拷贝一个新的副本
System.out.println(Arrays.toString(err));//打印[0, 9, 1, 4, 5]
}
关于最后一个.clone(),示意图如下