-------
1、数组
格式:元素类型[ ] 数组名 = new 元素类型[元素个数或数组长度]。
如:int[ ] arr = new int[3];( int arr[ ] = new int[3] )前者更规范。
数组初始化:
格式:元素类型[ ] 数组名 = new 元素类型[ ]{元素,元素,元素……元素}。
如:int[ ] arr = new int[ ]{ 1,5,6,4,8,5,2};
或:int[ ] arr = { 1,5,,4,78,5,2};
若不明确数组具体元素个数,定义:int[ ] arr = new int[4];
arr[0] = 2; arr[1] = 11;
2、数组在内存中的存储
数组在内容中分两部分存储:数组名(arr)存储在栈内存中,其中的值是对内存中数组元素的首地址值,指向该数组;而数组元素连续存储在堆内存中,没有对数组初始化,那么默认存放元素是0;如果将数组arr = null(清空),那么在堆内存中的该数组元素将会在一段时间后通过垃圾回收机制释放。
3、数组操作
数组操作包括获取最值、元素排序(包括选择排序、冒泡排序、希尔排序等)、查找(理解折半查找原理),在这所有应用中都是对最值的操作,同时数组也应用到进制转换问题中,适合初学者使用。
1>冒泡排序:
思想:首先将角标为0和1的两个元素作比较(降序为例),将比较结果的最大值赋给角标为1的,然后在一次向后比较,直到最后比较完毕,首先确定了该数组的最大值,那么我们在第二次作比较时可以省去最后角标(arr.length-1)中标识的最大值,比较次数少一次。依次推及,一个数组一共比较了length-1组,每组比较length-1-i(i=0&i<arr.length-1)次。算法如下:
//定义函数,实现冒泡排序,判断每次比较两数的最值(升序先确定最大值)。
public static void bubbleSort(int[ ] arr)
{
//外循环控制比较组数,一共比较:arr.length-1组,每组最值的地址都在变化。
for (int i = 0; i<arr.length-1; i++)
{
//内循环控制每组比较次数,每组比较:arr.length-i-1次。
//-i:让每一次比较的元素减少,-1:避免角标越界。
for (int j = 0; j<arr.length-i-1; j++)
{
if (arr[j]>arr[j+1])
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
2>选择排序:
思想:与冒泡不同,选择排序是将首角标标识的元素依次与之后的每个元素相比(降序为例),若首角标标识元素比后面元素小,则将相比元素转换,再首角标现在标识的值与后面的元素相比,始终保持变化的最大值在同一个位置,所以降序首先找到的是最大值,且在0角标位置。然后再将次角标作为首角标,按照前面步骤进行比较,就能够依次按照元素由大到小的顺序排列。算法如下,其中将两元素转换封装成一个功能:
//定义函数实现;两数的交换。
public static void swap(int[] arr,int a,int b)
{
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
//定义函数,实现选择排序,判断每次两数比较的最值(升序先确定最小值)。
public static void selectSort(int[] arr)
{
//外循环控制比较组数,一共比较:arr.length-1组,每组最值的地址保持不变。
for (int i = 0; i<arr.length-1; i++)
{
//内循环控制每组比较次数,每组比较:arr.length-i-1次。
for (int j = i+1; j<arr.length; j++)
{
if(arr[i]>arr[j]) //降序(arr[i]<arr[j])
swap(arr, i, j);
}
}
}
3>折半查找(二分查找):
思想:进行折半查找首先得保证该数组是一个有序的数组,若无序,则先将其排序后在进行。在给定数组查找一个数key,最直观的减小查找范围的方法就是从该数组中间值开始,那么中间值角标就是首尾角标之和再除2((min+max)>>1),然后在将中间值也key相比较,若相等,那么表示找到了该元素在数组中的位置。若不想等:其一,如果中间元素的值小于key,我们只需比中间元素右边的即可,也就是角标在(min+max)>>1之后的;其二,如果中间元素的值大于key,我们只需比中间元素左边的即可,也就是角标在(min+max)>>1之前的。如果在该数组找不到key相等的元素,那么min和max角标最后将超过对方出现min>max的情况,角标越界(通常我们设置返回-1 表示该值在数组中不存在key值)。如果我们需要插入一个数在该数组中(应用折半查找),只需获取该数组插入位置对应的角标即可。算法如下:
public static int halfSearch(int[] arr,int key)
{
int min = 0,max = arr.length-1,mid;
//只要满足最小角标<=最大角标,那么该数组就可以折半。
while (min<=max)
{
mid = (min+max)/2; //mid = (min+max)>>1
if (key>arr[mid])
min = mid + 1;
else if (key<arr[mid])
max = mid - 1;
//上面条件都不合适,那么就表示找到了该元素在数组中对应的位置,返回mid(中间角标)。
else
return mid;
}
//若min>max,那么在该数组中不存在该元素,返回min表示:角标min所标识的是插入该key的位置。
return min;
}