数组常见操作
对数组的最基本操作就是存和取,核心思想就是对角标的操作。
遍历
int[] arr = {45,56,86,2,5};
for(int x=0; x<arr.length; x++)
{
System.out.println("arr["+x+"]="+arr[x]);
}
1、使用循环完成遍历。
2、arr.length可获取数组的长度,需要注意的是数组最大的角标为arr.length-1。
最值
定义一个最值变量,遍历数组,采用逐一比较的方法,记录最大的数组变量值,或者对应角标,以便后续操作。
注意:定义的最值变量初始值应为数组中的任意值。
public static int qmax(int[] arr)
{
int max = arr[0];
for(int x=0; x<arr.length; x++)
{
if (arr[x]>max)
{
max = arr[x];
}
}
return max;
}
排序
1、选择排序法:
public static void paixu(int[] arr)
{
for(int x=0; x<arr.length-1; x++)
{
int k;
for (int y=x;y<arr.length;y++)
{
if(arr[y]>arr[x])
{
k=arr[x];
arr[x] = arr[y];
arr[y]=k;
}
}
}
}
注意:
1、外层循环无需再比较,故外层循环为想x<arr.length-1;,而内层需要与最后一个比较,故内层为y<arr.length;
2、冒泡排序法:
代码
public static void paixu1(int[] arr)
{
for(int x=0; x<arr.length-1; x++)
{
int k;
for (int y=0;y<arr.length-1-x;y++)
{
if(arr[y]<arr[y+1])
{
k=arr[y];
arr[y] = arr[y+1];
arr[y+1]=k;
}
}
}
}
注意:
以上排序方法,一般在面试的时候用,但是日常开发不要这么写。通常开发有java内置的函数,不过在使用该函数之前需要导入一个相应的模块。
import java.util.*;
........
Arrays.sort(arr);
其中,
{
k=arr[y];
arr[y] = arr[y+1];
arr[y+1]=k;
}
可以编写成一个函数,进行调用。
public static void swap(int[] arr,int a,int b)
{
int k=arr[a];
arr[a] = arr[b];
arr[b]=k;
}
以上为升序排序。速度最快的排序是希尔排序,运用的是位运算。
排序的性能问题
遍历时,记录最值和最值的角标,在遍历结束后,再进行换位。
public static void paixu2(int[] arr)
{
for(int x=0; x<arr.length-1; x++)
{
int num=arr[x],index=x;
for (int y=x;y<arr.length;y++)
{
if(num<arr[y])
{
num=arr[y];
index = y;
}
}
if(x!=index)
swap(arr,x,index);
}
}
基本查找
找数组中某个数字在数组中的位置,即标号。遍历,存在返回角标,不存在返回-1。
public static int getindex(int[] arr,int a)
{
for(int x=0; x<arr.length; x++)
{
if(arr[x]==a)
return x;
}
return -1;
}
折半查找
能用折半查找的前提是,查找的数组是有序的数组。
注意:
需要定义三个变量,分别指向头、尾、和头尾的中值。通过比较中值来确定数据在那一部分。不断移动头尾变量的值,最终可查到所查找变量对应的角标,找不到返回-1。
public static int getindex1(int[] arr,int a)
{
int min=0,max=arr.length-1;
int mid=(min+max)/2;
while(min<=max)
{
if(arr[mid]>a)
{
max=mid-1;
}
else if (arr[mid]<a)
{
min = mid+1;
}
else
return mid;
mid=(min+max)/2;
}
return -1;
}
注意:
在java内部有开发用的二分法查找函数:
Arrays.binarySearch(arr);
功能为:如果存在,返回角标,如果不存在,则返回-min-1,即负的插入点减1。(该做法是为了避免与存在时冲突),同时也需要加头文件。
进制转化
将一个整数转为16进制表现形式
思路:1、进行位运算,16进制即4位为一个单位。故可以4位4位的取整数。得到各个位上的16进制数。
2、取4位则可以采取与1111(15)的方式。
3、然后右移4位:>>> 4。(无符号右移)
4、大于10时要转化,即(char)(temp-10+‘A’),或者使用查表法。直接搞一个数组存0-F。
5、数据一多,就先存起来,再进行操作。所以可以定义一个数组,作为临时容器,用指针进行操作。
6、由于从低位开始转为,故从数组的最后一个开始存,这样输出的时候就是正序啦。
将一个整数转为其它制表现形式
1、2进制则与上1即可,而8进制则与上3位,即111(7)。
2、存储的数组长度需要加长啦。
以上,在java函数中都有相应的内置函数。
Integer.toBinaryString();//十进制→2进制
Integer.toHexString();//十进制 →16进制
integer.toOctal();//十进制 → 8进制