数组的练习--排序

1. 获取arr数组中所有元素的和

获取arr数组中所有元素的和(数组有三行,每行个数不一样)

i\jj = 0j=1j=2j=3
i=0358-
i=1129--
i=27064
public class ArrTest{
	public static void main(String[] args){
		int[][] arr1 = new int[][]{{3,5,8},{12,9},{7,0,6,4}}; 
		int sum =  0;
		for(int i =0; i < arr.length;i++){
			for(int j =0; j <arr[i].length;j++){
				sum += arr[i][j];
			}
		}
		System.out.println("总和为:" + sum );
	}
}

2.练习

声明:int[] x,y[];在给x,y变量赋值以后,以下选项允许通过编译的是:
1) x[0] = y;
2) y[0] = x;
3) y[0][0] = x;
4) x[0][0] = y;
5) y[0][0] = x[0];
6) x = y;

答案:2),5)
分析:x为int型的一维数组,y为int型的二维数组
1) x[0] = y;//x[0]为int型,y为二维数组,无法赋值
2) y[0] = x;//y[0]为一维数组,x也为一维数组
3) y[0][0] = x;//y[0][0]为int型,x为一维数组
4) x[0][0] = y;//x[0][0]写法错误,x为一维数组
5) y[0][0] = x[0];//y[0][0]为int型,x[0]为int型
6) x = y;//x为int型的一维数组,y为int型的二维数组

3.数组中涉及的常见算法

3.1 数组元素的赋值(杨辉三角、回形数等)

提示:
1.第一行有一个元素,第n行有n个元素
2.每一行的第一个元素和最后一个元素都是1
3.从第三行开始,对于非第一个元素和最后一个元素的元素,即:
yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];

如下图:
在这里插入图片描述

public class ArrTest{
	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] = 1;
		yangHui[i][i] = 1;
		//2.2给每行的非首末元素赋值
		if(i > 1){
			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();
	}
		
	}
}

3.2 求数值型数组中元素的最大值、最小值、平均数、总和等

定义一个int型的一维数组,包含10个元素,分别赋予一些随机整数,
然后求出所有元素的最大值、最小值、和值、平均值,并输出出来。
要求:所有随机数都是两位数
class ArraTest{
    public static void main(String[] args){
        int[] arr1 = new int[10];
        for(int i = 0;i < arr1.length;i++){
            arr1[i] = (int)(Math.random() * (99 - 10 + 1) + 10);
            System.out.print(arr1[i] + " ");
        }
        System.out.println();

        //求数组元素的最大值
        int max = arr1[0];
        for(int i = 1;i < arr1.length;i++){
            if(arr1[i] > max){
                max = arr1[i];
            }
        }
        System.out.println("最大值为:" + max);

        //求数组元素的最小值
        int min = arr1[0];
        for(int i = 1;i < arr1.length;i++){
            if(arr1[i] < min){
                min = arr1[i];
            }
        }
        System.out.println("最小值为:" + min);

        //求和
        int sum = 0;
        for(int i = 0;i < arr1.length;i++){
           sum += arr1[i];
            }
        System.out.println("和为:" + sum);
        System.out.println("平均值为:" + sum/ arr1.length);
    }
}

3.3 数组的复制、反转、查找(线性查找、二分法查找)


public class ArraTest{
    public static void main(String[] args){
        int[] arr1;
        arr1 = new int[]{2,3,5,7,11,13,15,17};
        //显示arr1的内容
        for (int i = 0;i < arr1.length;i++){
            System.out.print(arr1[i] + "\t");
        }
        System.out.println();
        //数组的复制(区别于数组变量的赋值,arr2 = arr1)
        int[] arr2 = new int[arr1.length];
        for (int i = 0;i < arr2.length; i++){
            arr2[i] = arr1[i];
        }
     // arr2 = arr1;赋值arr2变量等于arr1,不能称作数组的复制。
    
    }
}

反转

public class ArraTest{
    public static void main(String[] args){
        String[] arr1 = new String[]{"a","b","c","d","e","f","g"};
        //方法一
        for (int i = 0; i < arr1.length/2; i++) {
            String temp = arr1[i];
            arr1[i] = arr1[arr1.length - 1- i];
            arr1[arr1.length -1 -i] = temp;
        }
        //遍历
        for (int i = 0;i < arr1.length;i++) {
            System.out.print(arr1[i] + " ");
        }
        System.out.println();
        //方法二
        for (int i = 0,j = arr1.length -1; i < j; i++,j--) {
            String temp = arr1[i];
            arr1[i] = arr1[j];
            arr1[j] = temp;
        }
        //遍历
        for (int i = 0;i < arr1.length;i++) {
            System.out.print(arr1[i] + " ");
        }


    }
}

线性查找

public class ArraTest{
    public static void main(String[] args){
        String[] arr1 = new String[]{"a","b","c","d","e","f","g"};
        String dest = "c";
        boolean isFlag = true;
        for (int i = 0;i < arr1.length;i++){
            if(dest.equals(arr1[i])){
                System.out.println("找到了," + "位置为" + i);
                isFlag = false;
                break;
            }
        }
        if(isFlag){
            System.out.println("很遗憾,没找到");
        }



    }
}

二分法:
前提:所要查找的数组必须有序

public class ArraTest{
    public static void main(String[] args){
       int[] arr1 = new int[]{-89,0,23,45,78,234,567,789,879};
       int dest = 890;//要查找的目标
       int head = 0;//标志首位下标
       int end = arr1.length -1;//标志末尾下标
       boolean  isFlag = true;
       while(head <= end){
           if(dest == arr1[(head + end)/2]){
               System.out.println("找到了,位置为" + (head + end)/2);
               isFlag = false;
               break;
           }else if(dest < arr1[(head + end)/2]  ){
               end = (head + end)/2  - 1;
           }else {
               head = (head + end)/2  + 1;
           }
       }
       if(isFlag){
           System.out.println("很遗憾,没找到" );
       }

    }
}

4. 数组中涉及到的常见算法——排序算法

1、衡量排序算法的优劣

  • 时间复杂度:分析关键字的比较次数和记录的移动次数
  • 空间复杂度:分析排序算法中需要多少辅助内存
  • 稳定性:若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的

2、排序算法分类:内部排序和外部排序

  • 内部排序:整个排序过程不需要借助外部存储器(如磁盘等),所有排序操作都在内存中完成。
  • 外部排序:参与排序的数据非常多,数据量非常大,计算机无法把整个排序过程放在内存中完成,必须借助外部存储器,外部排序最常见的是多路归并排序,可以认为外部排序是由多次内部排序组成。

3、十大内部排序算法

  • 选择排序
    直接选择排序、堆排序(知道排序思想)
  • 交换排序
    冒泡排序、快速排序(会手写)
  • 插入排序
    直接插入排序、折半插入排序、Shell排序
  • 归并排序(知道排序思想)
  • 桶式排序(少见)
  • 基数排序(少见)

4、算法的5大特征
在这里插入图片描述

4.1冒泡排序

冒泡排序时间复杂度:O(n^2)
冒泡排序原理:重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把他们交换过来
排序思想:
1、比较相邻的元素,如果第一个比第二个大(升序),就交换它们两个;
2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对,这步做完后,最后的元素会是最大的数;
3、针对所有的元素重复以上的步骤,除了最后一个;
4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较为止。

class BubbleSortTest()
public static void main(String[] args){
int[] arr = new int[]{43,32,76,-98,0,64,33,-21,32,99};
	for(i = 0;i < arr.length - 1;i++){
		for(j = 0; j < arr.length - 1 -i;j++){
			if(arr[j] > arr[j+1]){
				int temp; 
				temp = arr[j+1];
				arr[j+1] = arr[j];
				a[j] = temp;
			}
		}
	}
	for(i = 0;i < arr.length;i++){
	System.out.print{arr[i] + " "};
	}
}

4.2 快速排序

快速排序时间复杂度为O(nlog(n))
排序思想:

  1. 从数列中挑出一个元素称为”基准“;
  2. 重新排序数列,所有元素比基准小的值摆放在基准前面,比基准大的值摆在基准后面,在这个分区结束之后,该基准处于数列的中间位置(不一定是二分之一),这个称为分区操作;
  3. 递归地把小于基准值元素的子数列和大于基准值元素的子数列排序;
  4. 递归的最底部情形是,数列的大小是0或1,也就是永远都已经被排序好了,虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代中,它至少会把一个元素摆到它最后的位置去。

5.排序算法性能对比

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

6.Arrays工具类的使用

java.util.Arrays类是操作数组的工具类,里面有很多操作数组的方法。例如:

方法作用
boolean eauals(int[] a,int[] b)判断两个数组是否相等
String toString(int[] a)输出数组信息
void sort(int[] a)对数组进行排序
int binarySearch(int[] a,int key)对排序后的数组使用二分法检索指定的值

7.数组使用过程中的常见异常

  1. 数组角标越界的异常:ArrayIndexOutofBoundsException
  2. 空指针异常:NullPointerException
    在这里插入图片描述

一旦出现异常,后面的代码不再执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java中的Arrays类提供了许多操作数组的方法,其中包括对数组进行排序的方法。使用Arrays.sort()方法可以对数组进行排序,该方法可以对任何类型的数组进行排序,包括基本类型和对象类型。 例如,对一个整型数组进行排序,可以使用以下代码: int[] arr = {5, 2, 8, 1, 9}; Arrays.sort(arr); 排序后,数组arr的值为{1, 2, 5, 8, 9}。 如果要对一个字符串数组进行排序,可以使用以下代码: String[] arr = {"apple", "banana", "orange", "pear"}; Arrays.sort(arr); 排序后,数组arr的值为{"apple", "banana", "orange", "pear"}。 需要注意的是,Arrays.sort()方法会改变原始数组的顺序,如果需要保留原始数组的顺序,可以先将数组复制一份再进行排序。 ### 回答2: Java数组是一种很常见的数据类型,在实际开发中使用频率也很高。在Java中,对于数组的操作一般使用Arrays类来完成,该类提供了很多实用的方法,比如数组排序等。 数组排序是对数组中的元素进行排序的过程,可以按照升序或者降序排列。Java中使用Arrays类提供的sort方法对数组进行排序,方法的原型如下: public static void sort(数组名); 其中,数组名代表需要排序数组。如果数组中的元素为基本数据类型(如int、double等),则默认按照升序排列;如果数组中的元素为字符串类型,则按照字典序升序排列。 下面是一个示例代码,演示如何使用Arrays类对数组进行排序: ``` import java.util.Arrays; public class ArraySortDemo { public static void main(String[] args) { int[] nums = {3, 7, 1, 9, 5}; System.out.println("排序前:" + Arrays.toString(nums)); Arrays.sort(nums); System.out.println("排序后:" + Arrays.toString(nums)); } } ``` 代码执行结果如下: ``` 排序前:[3, 7, 1, 9, 5] 排序后:[1, 3, 5, 7, 9] ``` 可以看到,排序前的数组为3、7、1、9、5,排序后的数组为1、3、5、7、9,按照升序排列。 除了按照升序排列之外,还可以按照降序排列。可以使用Arrays类的sort方法,同时指定排序算法和排序方式,如下所示: ``` import java.util.Arrays; import java.util.Collections; public class ArraySortDemo { public static void main(String[] args) { Integer[] nums = {3, 7, 1, 9, 5}; System.out.println("排序前:" + Arrays.toString(nums)); Arrays.sort(nums, Collections.reverseOrder()); System.out.println("排序后:" + Arrays.toString(nums)); } } ``` 代码执行结果如下: ``` 排序前:[3, 7, 1, 9, 5] 排序后:[9, 7, 5, 3, 1] ``` 可以看到,本次使用了Collections类提供的reverseOrder方法,将排序方式指定为降序。 综上所述,通过Arrays类提供的sort方法,我们可以很轻松地对数组进行排序。但是需要注意的是,如果数组中的元素为自定义类型,需要在自定义类型中实现Comparable接口或者Comparator接口,并重写compareTo方法或compare方法,才能实现对数组排序。 ### 回答3: Java中自带了一个Arrays类,其中包含了对数组排序的方法。Arrays类中的sort()方法可以以升序或降序的形式对数组进行排序。下面就介绍一下如何使用sort()方法对数组进行排序。 首先,我们创建一个数组,然后使用sort()方法对其进行排序。 ``` int[] arr = {10, 5, 8, 20, 13}; Arrays.sort(arr); ``` 上面的代码会将数组arr按照从小到大的顺序进行排序。我们可以输出一下排序后的结果。 ``` for (int i : arr) { System.out.print(i + " "); } ``` 运行上面的代码可以看到输出结果为:5 8 10 13 20。 除了按照从小到大的顺序排序外,sort()方法还可以按照从大到小的顺序对数组进行排序。我们只需要添加一个比较器即可。 ``` int[] arr2 = {10, 5, 8, 20, 13}; Arrays.sort(arr2, Collections.reverseOrder()); ``` 上面的代码会将数组arr2按照从大到小的顺序进行排序。我们同样输出一下排序后的结果。 ``` for (int i : arr2) { System.out.print(i + " "); } ``` 运行上面的代码可以看到输出结果为:20 13 10 8 5。 除了对int类型的数组进行排序,sort()方法也支持对其他类型的数组进行排序,比如String、Double等。 总的来说,使用Arrays类中的sort()方法可以非常方便地对数组进行排序,提高我们的开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值