微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

数组中的常见算法尚硅谷

数组中的常见算法

1.1、数组元素赋值

  • 杨辉三角

    在这里插入图片描述

package com.arr;

/**
 * 使用二维数组打印一个 10 行杨辉三角。
 * 【提示】
 * 1. 第一行有 1 个元素, 第 n 行有 n 个元素
 * 2. 每一行的第一个元素和最后一个元素都是 1
 * 3. 从第三行开始, 对于非第一个元素和最后一个元
 * 素的元素。即:
 * yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
 */
public class ArrayTest07 {
    public static void main(String[] args) {
        //1.声明并初始化二维数组
        int[][] yangHui = new int[10][];
        //2.给数组的元素赋值
        for(int i = 0;i < yangHui.length;i++){
            yangHui[i] = new int[i + 1];
            //2.1 给首末元素赋值
            yangHui[i][0] = yangHui[i][i] = 1;
            //2.2 给每行的非首末元素赋值
            for(int j = 1;j < yangHui[i].length - 1;j++){
                yangHui[i][j] = yangHui[i-1][j-1] + yangHui[i-1][j];
            }
        }
        //3.遍历二维数组
        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();
        }
    }
}

  • 创建一个长度为6的int型数组,要求数组元素的值都在1-30之间,且是随机赋值。同时,要求元素的值各不相同。
package com.alg;

/**
 * 创建一个长度为6的int型数组,要求数组元素的值都在1-30之间,且是随机赋值。同时,要求
 * 元素的值各不相同。
 */
public class AlgTest01 {
    public static void main(String[] args) {
        int[] arr = new int[6];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * 30) + 1;
            for (int j = 0; j < i; j++) {
                if (arr[i] == arr[j]) {
                    i--;
                    break;
                }
            }
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }

    }
}

1.2、数组元素的操作

package com.alg;

/**
 * 定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,
 * 然后求出所有元素的最大值,最小值,和值,平均值,并输出出来 。
 * 要求:所有随机数都是两位数。
 */
public class AlgTest02 {
    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);
        }
        //遍历
        for(int i = 0;i < arr.length;i++){
            System.out.print(arr[i] + "\t");
        }
        System.out.println();
        //求数组元素的最大值
        int maxValue = arr[0];
        for(int i = 1;i < arr.length;i++){
            if(maxValue < arr[i]){
                maxValue = arr[i];
            }
        }
        System.out.println("最大值为:" + maxValue);
        //求数组元素的最小值
        int minValue = arr[0];
        for(int i = 1;i < arr.length;i++){
            if(minValue > arr[i]){
                minValue = arr[i];
            }
        }
        System.out.println("最小值为:" + minValue);
        //求数组元素的总和
        int sum = 0;
        for(int i = 0;i < arr.length;i++){
            sum += arr[i];
        }
        System.out.println("总和为:" + sum);
        //求数组元素的平均数
        int avgValue = sum / arr.length;
        System.out.println("平均数为:" + avgValue);
    }
}

package com.alg;

/**
 * (1)创建一个名为ArrayTest的类,在main()方法中声明array1和array2两个变量,
 * 他们是int[]类型的数组。
 * (2)使用大括号{},把array1初始化为8个素数:2,3,5,7,11,13,17,19。
 * (3)显示array1的内容。
 * (4)赋值array2变量等于array1,修改array2中的偶索引元素,使其等于索引值
 * (如array[0]=0,array[2]=2)。打印出array1。
 */
public class AlgTest03 {
    public static void main(String[] args) {
        int[] arr1,arr2;
        arr1 = new int[]{2,3,5,7,11,13,17,19};
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i] + "\t");
        }
        arr2 = arr1;

        for (int i = 0; i < arr2.length; i++) {
            if (i % 2 == 0){
                arr2[i] = i;
            }
        }
        System.out.println();
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i] + "\t");
        }
    }
}

1.3、数组的复制与反转

package com.alg;

/**
 *
 */
public class AlgTest04 {
    public static void main(String[] args) {
        String[] arr1 = new String[]{"JJ","DD","MM","GG"};

        //数组的复制
        String[] arr2 = new String[arr1.length];
        for (int i = 0; i < arr1.length; i++) {
            arr2[i] = arr1[i];
        }
        //数组的反转
        for (int i = 0; i < arr1.length/2; i++) {
            String temp = arr1[i];
            arr1[i] = arr1[arr1.length - i - 1];
            arr1[arr1.length - i - 1] = temp;
        }
        //遍历
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i] + "\t");
        }
    }
}

1.4、数组的查找

  • 线性查找
package com.alg;

/**
 * 数组中元素的查找操作
 * 线性查找
 * 二分查找
 */
public class AlgTest05 {
    public static void main(String[] args) {
        String[] arr1 = new String[]{"JJ","DD","MM","GG"};
        String[] arr2 = new String[arr1.length];
        String dest = "DD";
        //线性查找
        boolean flag = true;
        for (int i = 0; i < arr1.length; i++) {
            if (dest.equals(arr1[i])){
                System.out.println("指定元素的位置为:" + i);
                flag = false;
                break;
            }
        }
        if (flag){
            System.out.println("匹配失败");
        }
    }
}

  • 二分查找
package com.alg;

/**
 * 折半查找
 * 前提:查找的元素必须有序
 */
public class AlgTest06 {
    public static void main(String[] args) {
        int[] arr = new int[]{-89,-34,0,1,25,225,369,377,548,655};
        int dest = 1;//要查找的元素
        int start = 0;//开始头索引
        int end = arr.length - 1;//最后一个元素的位置
        boolean flag = true;
        while (start <= end){
            int mid = (start + end)/2;
            if (dest == arr[mid]){
                System.out.println("指定元素的位置为:" + mid);
                flag = false;
                break;
            }else if (arr[mid] > start){
                end = mid - 1;
            }else {
                start = mid + 1;
            }
        }
        if (flag){
            System.out.println("匹配异常");
        }
    }
}

1.5、排序算法

  • 冒泡排序

冒泡排序的算法较为简单,就是循环比较相邻两个元素的大小,若两个元素大小的相对位置正确,那么两个元素的位置不变,如果两个元素的相对位置不对,就将两个元素的相对位置进行对换,循环往复,直至所有的元素排序正确。

package com.sort;

/**
 * 冒泡排序的实现
 */
public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = new int[]{12,-3,-15,32,17,-89,126,111,0,35};
        int temp = 0;
        for (int i = 0;i < arr.length; i++){
            for (int j = 0; j < arr.length - i - 1; j++){
                if (arr[j] > arr[j + 1]){
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j + 1] = temp;
                }
            }
        }
    }
}

其算法思想是:先从数组中随便找到一个基准数字,在数组两端分别定义一个变量,low和high,low指向数组第一个元素,high指向数组最后一个元素,low向右移动,high向左移动,当low比基准数字小,high比基准数字大的时候,就把low和high对应的元素进行交换,直到low大于等于high的时候,第一次循环结束。循环结束,基准数字左边的数字都比它小,右边的都比它大。然后进行第二次循环,再重新找一个基准数字循环往复,直至所有元素得到正确的排序。

    public class QuickSort {
        private static void swap(int[] data, int i, int j) {
            int temp = data[i];
            data[i] = data[j];
            data[j] = temp;
        }

	private static void subSort(int[] data, int start, int end) {
		if (start < end) {
			int base = data[start];
			int low = start;
			int high = end + 1;
			while (true) {
				while (low < end && data[++low] - base <= 0);
				while (high > start && data[--high] - base >= 0);
				if (low < high) {
					swap(data, low, high);
				} else {
					break;
				}
			}
			swap(data, start, high);
			subSort(data, start, high - 1);//递归调用
			subSort(data, high + 1, end);
		}
	}
	public static void quickSort(int[] data){
		subSort(data,0,data.length-1);
	}
	
	public static void main(String[] args) {
		int[] data = { 9, -16, 30, 23, -30, -49, 25, 21, 30 };
		System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
		quickSort(data);
		System.out.println("排序之后:\n" + java.util.Arrays.toString(data));
	}
}

在这里插入图片描述

1.6、Arrays工具类的使用

java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法

  • Arrays工具类中的一些方法
boolean equals(int[] a,int[] b) 判断两个数组是否相等。
String toString(int[] a) 输出数组信息。
void fill(int[] a,int val) 将指定值填充到数组之中。
void sort(int[] a) 对数组进行排序。
int binarySearch(int[] a,int key) 对排序后的数组进行二分法检索指定的值
  • 常见异常

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐