文章目录
一. int类型的数组元素拷贝
需求:把源数组的索引N开始,拷贝M个数组元素到目标数组的索引N开始的位置上。
新建ArrayCopeDemo.java
//数组元素拷贝
//数组元素拷贝
class ArrayCopeDemo
{
//打印数组
static void printArray(int[] arr){
String ret = "[";
for (int i : arr )
{
ret += i;
ret += "\t";
}
ret += "]";
System.out.println(ret);
}
//拷贝方法
/*
参数:
src: 源数组
srcPos:从源数组中哪一个索引位置开始拷贝
dest:目标数组
destPos:从目标数组中哪一个索引位置开始拷贝
length:拷贝元素的个数
*/
static void arrayCope(int[] src,int srcPos,int dest[],int destPos,int length){
if (srcPos + length > src.length)
{
System.out.println("超过拷贝范围!");
return;
}
for (int i = destPos;i < destPos + length ;i ++)
{
dest[i] = src[i];
}
}
public static void main(String[] args)
{
int[] src = new int[]{0,1,2,3,4,5,6,7,8,9};
int[] dest = new int[10];
printArray(src);
//调用拷贝方法
arrayCope(src,2,dest,2,3);
//printArray(dest);
//System.arraycopy(src,3,dest,4,2);
printArray(dest);
}
}
该程序不够健壮,比如数组越界等问题。
只能拷贝int类型。
二. system中的arraycopy方法
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
- src - 源数组
- srcPos - 源数组中的起始位置
- dest - 目标数组
- destPos - 目标数据中的起始位置
- length - 要复制的数组元素的数量
System.arraycopy(src,3,dest,4,2);
- Object:Java语言中的根类,Object可以表示任意数据类型。
- 该方法没有方法体,该方法使用了native修饰符(本地方法),该方法底层使用了c/c++语言
实现的,Java直接调用了其他语言编写好的功能。
三. 排序算法
- 按照指定顺序:升序,降序。
- 排序的分类:
- 选择排序(直接选择排序,堆排序)
- 交换排序(冒泡排序,快速排序)
- 插入排序(直接插入排序,二分法插入排序,Shell排序)
- 归并排序等
- 冒泡排序算法的运作如下:(从后往前)
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
新建ArraySortDemo.java
class ArraySortDemo
{
//打印数组
static void printArray(int[] arr){
String ret = "[";
for (int i : arr )
{
ret += i;
ret += "\t";
}
ret += "]";
System.out.println(ret);
}
//冒泡排序方法
static void Bubble(int[] arr){
for (int i = 0;i < arr.length -1 ;i ++ )
{
for (int j = 0;j < arr.length - 1 - i ;j ++ )
{
if (arr[j + 1] < arr [j])
{
int a;
a = arr[j + 1];
arr[j+1] = arr[j];
arr[j] = a;
}
}
}
}
public static void main(String[] args)
{
int[] arr = new int[]{2,3,10,7,1,9};
Bubble(arr);
printArray(arr);
}
}
修改ArraSortDemo.java
class ArraySortDemo
{
...
//选择排序
static void selection(int [] arr){
for (int i = 0;i < arr.length ;i ++ )
{
int tem1 = i +1;
for (int j = i +1;j < arr.length ;j ++ )
{
if (arr[tem1] > arr[j])
{
tem1 = j;
}
}
int tem = arr[tem1];
arr[tem1] = arr[i];
arr[i] = tem;
}
}
public static void main(String[] args)
{
int[] arr = new int[]{2,3,10,7,1,9};
//Bubble(arr);
printArray(arr);
//选择排序
selection(arr);
printArray(arr);
}
}
四. 搜索算法
-
方式1:线性搜索(从头搜到尾或从尾搜到头):indexOf/lastIndexOf
对于元素过多的数组,性能极低:N个元素,循环次数 = (N + 1) / 2; -
方式2:二分搜索法/二分查找法/这半查找法
前提:数组元素必须有序
新建BinarySeatchDemo.java
//二分查找法Demo
class BinarySearchDemo
{
//二分查找法方法
static int binary(int[] arr,int num){
if (num > arr[arr.length - 1] || num < arr[0])
{
System.out.println("亲,没有这个数哦");
return -1;
}
int low = 0;
int high = arr.length;
int mid = 0;
while (low <= high)
{
mid = (low + high) / 2;
if (arr[mid] > num)//猜大了
{
high = mid;
}else if(arr[mid] < num){//猜小了
low = mid;
}else if (arr[mid] == num)
{
break;
}
}
return mid;
}
public static void main(String[] args)
{
int[] arr = new int[]{1,2,3,4,5,6,7,8,9};
System.out.println(binary(arr,9));
}
}
五. 自行封装数组操作的工具类ArrayUtil
新建ArrayUtil.java,编写工具类
//对之前数组的方法进行封装
class ArrayUtil
{
//按格式打印数组元素
static void print(int[] arr){
if (arr == null)
{
System.out.println("null");
return;
}
String ret = "[";
for (int i = 0;i < arr.length;i ++ )
{
ret += arr[i];
if (i == arr.length - 1)
{
break;
}
ret += ",";
}
ret += "]";
System.out.println(ret);
}
//拷贝方法
/*
参数:
src: 源数组
srcPos:从源数组中哪一个索引位置开始拷贝
dest:目标数组
destPos:从目标数组哪个索引位置开始
length:拷贝元素的个数
*/
static void copy(int[] src,int srcPos,int dest[],int destPos,int length){
if (srcPos + length > src.length)
{
System.out.println("超过拷贝范围!");
return;
}
for (int i = destPos;i < destPos + length ;i ++)
{
dest[i] = src[i];
}
}
//冒泡排序方法
static void bubble(int[] arr){
for (int i = 0;i < arr.length -1 ;i ++ )
{
for (int j = 0;j < arr.length - 1 - i ;j ++ )
{
if (arr[j + 1] < arr [j])
{
int a;
a = arr[j + 1];
arr[j+1] = arr[j];
arr[j] = a;
}
}
}
}
//选择排序
static void selection(int [] arr){
for (int i = 0;i < arr.length ;i ++ )
{
int tem1 = i;
for (int j = i +1;j < arr.length ;j ++ )
{
if (arr[tem1] > arr[j])
{
tem1 = j;
}
}
int tem = arr[tem1];
arr[tem1] = arr[i];
arr[i] = tem;
}
}
//二分查找法方法
static int binary(int[] arr,int num){
if (num > arr[arr.length - 1] || num < arr[0])
{
System.out.println("亲,没有这个数哦");
return -1;
}
int low = 0;
int high = arr.length;
int mid = 0;
while (low <= high)
{
System.out.println(low + "-----" + high);
mid = (low + high) / 2;
if (arr[mid] > num)//猜大了
{
high = mid - 1;
}else if(arr[mid] < num){//猜小了
low = mid + 1;
}else if (arr[mid] == num)
{
break;
}
}
System.out.println(mid);
return mid;
}
}
对工具类进行测试
新建ArrayUtil.java
class ArrayUtilDemo
{
public static void main(String[] args)
{
int[] arr = new int[]{1,2,3,4,-1,-6,3,7,8};
int[] dest = new int[9];
ArrayUtil.print(arr);
//冒泡排序
ArrayUtil.bubble(arr);
ArrayUtil.print(arr);
//数组的拷贝
ArrayUtil.copy(arr,2,dest,3,3);
ArrayUtil.print(dest);
//二分查找
ArrayUtil.binary(arr,4);
}
}
六. Java内置的数组工具类Arrays
在java.util.Arrays包下
新建ArrayDemo.java
//内置工具类的Demo
class ArraysDemo
{
public static void main(String[] args)
{
int[] arr = new int[]{1,23,5,6,7,3,6,8};//转成字符串
String ret = java.util.Arrays.toString(arr);
System.out.println(ret);
java.util.Arrays.sort(arr,3,3);//排序,前闭后开,只排序索引3-5,索引6不排
ret = java.util.Arrays.toString(arr);//转换为字符串
System.out.println(ret);
int index = java.util.Arrays.binarySearch(arr,6);
System.out.println(index);
}
}