2.数组的算法

一. 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直接调用了其他语言编写好的功能。

三. 排序算法

  • 按照指定顺序:升序,降序。
  1. 排序的分类:
  2. 选择排序(直接选择排序,堆排序)
  3. 交换排序(冒泡排序,快速排序)
  4. 插入排序(直接插入排序,二分法插入排序,Shell排序)
  5. 归并排序等
  • 冒泡排序算法的运作如下:(从后往前)
  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

新建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

扫描二维码关注公众号,回复: 10380543 查看本文章
//二分查找法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

image
在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);
	}
}
发布了58 篇原创文章 · 获赞 0 · 访问量 746

猜你喜欢

转载自blog.csdn.net/huang_kuh/article/details/104846561
今日推荐