java数组中常见的算法综合

65 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第十二天,点击查看活动详情

数组中涉及的常见算法

image.png

第一题(杨辉三角)

二维数组写杨辉三角形(视频讲解链接)

www.bilibili.com/video/BV1Qb…

题目要求

image.png

考点:二维数组的赋值和声明问题

难点:给0部分赋值

image.png

代码

package com.atguigu.exec;

public class ShuZusuanfa {
	public static void main(String[] args){
		//声明并初始化二维数组
		int[][] yangHui = new int[10][];
		//给数组元素赋值
		for(int i =0;i<yangHui.length;i++){
			yangHui[i]=new int[i+1];
			//给每行的首末元素赋值1
			yangHui[i][0]=1;
			yangHui[i][i]=1;
			//给每行的中间元素赋值
			if(i>1){
				for(int j = 1;j<yangHui[i].length-1;j++){
					//任意元素等于其上的元素(a)与a左边元素的和(除了首尾)
					yangHui[i][j]=yangHui[i-1][j-1]+yangHui[i-1][j];
				}
			}
			
		}
		//遍历二维数组
		for(int i = 0;i<yangHui.length;i++){
			for(int j = 0;j<yangHui[i].length;j++){
				System.out.print(yangHui[i][j]+" ");
			}
			System.out.println();//每行完了换行
		}
		
	}

}

控制台:

image.png

第二题

题目要求

image.png

第三题

image.png


package com.atguigu.exec;
//生成随机的两位数[10 99]
//(int)(Math.random()*(99-10+1)+10)

public class ArrayTest {
	public static void main(String[] args){
		int[] arr = new int[10];
		
		for(int i = 0;i<arr.length;i++){
			arr[i]=(int)(Math.random()*(99-10+1)+10);
		}
		//最大值
		int maxValue = arr[0];
		for(int i=0;i<arr.length;i++){
			if(arr[i]>arr[0]){
				maxValue=arr[i];
			}
		}
		//最小值
		int minValue = arr[0];
		for(int i=0;i<arr.length;i++){
			if(arr[i]<arr[0]){
				minValue=arr[i];
			}
		}
		//总和
		int sum = 0;
		for(int i=0;i<arr.length;i++){
			sum+=arr[i];
		}
		//平均数
		int average = sum/arr.length;
	}
}

第四题 数组的复制

image.png


package com.atguigu.exec;

public class Copy {
	public static void main(String[] args){
		int[] array1,array2;
		array1 = new int[]{2,3,5,7,11,13,17,19};
		for(int i = 0;i<array1.length;i++){
			System.out.print(array1[i]+"\t");  //2	3	5	7	11	13	17	19
		}
		//把array1的值赋给array2
		//不能称作数组的复制
		array2 = array1;
		for(int i=0;i<array2.length;i++){
			if(i%2==0){
				array2[i]=i;
			}
		}
		System.out.println();
		//再打印一下array1     0	3	2	7	4	13	6	19
		for(int i = 0;i<array1.length;i++){
			System.out.print(array1[i]+"\t");
		}
		
	}

}

//array2 = array1; 不能称作数组的复制

image.png

image.png

既然上面的不能实现数组的复制,怎么来实现一下数组的复制

package com.atguigu.exec;

public class Copy2 {
	public static void main(String[] args){
		int[] array1,array2;
		array1 = new int[]{2,3,5,7,11,13,17,19};
		for(int i = 0;i<array1.length;i++){
                System.out.print(array1[i]+"\t");  //2	3	5	7	11	13	17	19
		}
		//把array1的值赋给array2
		//不能称作数组的复制
//		array2 = array1;
		//实现数组的复制
		array2=new int[array1.length];
		for(int i=0;i<array1.length;i++){
			array2[i]=array1[i];
		}
		
		
		for(int i=0;i<array2.length;i++){
			if(i%2==0){
				array2[i]=i;
			}
		}
		System.out.println();
//再打印一下array1     2	3	5	7	11	13	17	19
		for(int i = 0;i<array1.length;i++){
			System.out.print(array1[i]+"\t");
		}
		
	}

}

这下 修改数组2的元素值就不会再影响数组1了

内存解析

image.png

第五题 线性查找和二分法查找

二分法查找原理 image.png

代码实现

//查找
		//线性查找
                String[] test = new String[]{"jj","dd","kk"};
		String dest="jj" ;
		Boolean isFlag = false;
		for(int i=0;i<test.length;i++){
			if(dest.equals(test[i])){
				System.out.println("找到了,位置为"+i);
				isFlag=true;
				break;
				
			}
		}
		if(isFlag==false){
			System.out.println("没找到");
		}







//二分法查找
		//前提:所要查找的数组必须有序
		int[] arr = new int[]{12,34,56,78,90,123,1234,12345};
		int head = 0; //初始首索引
		int last= arr.length-1; //初始末索引
		Boolean isFlag1 = true;
		int desti=123;
		while(head<last){
			int middle = (head+last)/2;
			if(desti==arr[middle]){
				isFlag1= false;
				System.out.println("find,位置在"+middle);
				break;
				
			}else if(desti>arr[middle]){
				head = middle+1;
				
			}else{
				last=middle-1;
			}
					
			
		}
		if(isFlag1){
			System.out.println("没找到");
		}
		

第六题 数组反转


//数组的反转
            String[] test = new String[]{"jj","dd","kk"};
		//方法一
		for(int i=0;i<test.length/2;i++){
		String temp=test[i];
		test[i]=test[test.length-i-1];
		test[test.length-i-1]=temp;
		
		}
		//遍历(看看反转成功了吗
		for(int i=0;i<test.length;i++){
			System.out.print(test[i]); 
		}
		
		
		
		//方法二
		for(int i=0,j=test.length-1;i<j;i++,j--){
			String temp = test[i];
			test[i]=test[j];
			test[j]=temp;
		}
		
		for(int i=0;i<test.length;i++){
			System.out.println("*******");
			System.out.print(test[i]+"\t"); 
		}

第七题 排序算法

image.png

image.png

image.png 冒泡排序和快速排序都要会手写

堆排序和归并排序要了解其思想

冒泡排序

www.bilibili.com/video/BV1Qb…

int[] a3 = new int[]{3,4,1,6,3,9,-10};
		for(int i = 0;i<a3.length;i++){
			System.out.print(a3[i]+"\t");
		}
		
		//冒泡排序
		for(int i= 0;i<a3.length-1;i++){  //外层表示总共要交换几大轮;8个元素要有7大轮
			for(int j= 0;j<a3.length-1-i;j++){//针对每一大轮,要交换几次
				if(a3[j]>a3[j+1]){
				int temp=a3[j];
				a3[j]=a3[j+1];
				a3[j+1]=temp;
				
				}
				
				
			}
		}
		
		for(int i = 0;i<a3.length;i++){
			System.out.print(a3[i]+"\t");
		}
		

快速排序

思想

image.png

image.png 代码实现

package Sort;
 
public class 快速排序 {
	public static void main(String[] args) {
		int[] arr = {6,1,2,7,9,3,4,5,10,8};
		sort(arr, 0, arr.length-1);
		print(arr); 
	}
	
	public static void sort(int[] arr,int leftBound,int rightBound) {
		if(leftBound >= rightBound) return;
		int mid= partition(arr, leftBound, rightBound); //得到轴的位置
		sort(arr, leftBound, mid-1); //左边排序
		sort(arr, mid+1, rightBound); //右边排序
	}
	static int partition(int[] arr, int leftBound,int rightBound) {
		int pivot = arr[rightBound]; //指定数组最右边的数是用来比较的值 轴
		int left = leftBound;
		int right = rightBound - 1;
		
		while (left <= right) {
			while(left <= right && arr[left] <= pivot) left++;
			while(left <= right && arr[right] > pivot) right--;
			
			if (left < right) {
				//如果 左边的数比右边的数小  两个数交换
				swap(arr, left, right);
			}
		}
		//把left最后一次指向的位置与pivot(轴)的位置交换
		swap(arr, left, rightBound);
		
		return left; //返回轴的位置
	}
	
	static void swap(int[] arr,int i,int j) {
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
	static void print(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " ");
			
		}
	}
}

排序算法性能比较

image.png 快排的时间复杂度和冒泡排序的时间复杂度需要记住.

image.png

算法介绍

image.png