栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java数组算法day8

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java数组算法day8

Java数组算法day8

数组元素的赋值求数值型数组中元素的最大值、最小值、平均数、总和数组的复制,反转,查找(线性查找,二分法查找)复制数组的反转查找

线性查找二分法查找 排序

排序算法的分类十大内部排序算法

选择排序交换排序插入排序归并排序桶式排序基数排序 算法的五大特征冒泡排序的实现快速排序的实现内部排序算法的性能比较排序算法的选择数组Arrays工具类的使用编程过程中数组的常见异常

数组元素的赋值

例如上次练习的杨辉三角的问题

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

例:定义一个int型的一维数组,包含十个元素,分别赋一些随机整数,然后要求求出所有元素的最大值,最小值,和值,平均值,并输出出来。要求:所有随机数都是二位数

import java.util.Scanner;

public class demo {
    public static void main(String[] args) {
        int[] arr = new int[10];
        for (int i = 0;i arr[j])
                {
                    minVaule = arr[j];
                }
            }
            System.out.println("最小值为"+minVaule);
            //总和
            int sum = 0;
            for (int i = 0;i 
数组的复制,反转,查找(线性查找,二分法查找) 

例:使用简单数组
(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。
思考:array1和array2是什么关系?
拓展:修改题目,实现array2对array1数组的复制

public class ArrayTest {
    public static void main(String[] args) {
        int[] array1;
        int[] array2;
        //对array1赋值
        array1 = new int[]{2, 3, 5, 7, 11, 13, 17, 19};
        //输出array1
        for (int i = 0; i < array1.length; i++) {
            System.out.print(" "+array1[i]);
        }
        System.out.println();
        //注意这里将array1 = array2是将1的地址赋给2,意思是当用这种方式复制1的值给2时,因为给的是地址,所以当2改变的时候1也会改变
        array2 = array1;
        //输出array2
        for (int i = 0; i < array2.length; i++) {
            System.out.print(" "+array2[i]);
        }
        System.out.println();
        //改变array2
        for (int i =0;i 

以上这种情况不能叫做数组的复制,只是将array1的地址赋给了array2,简单来说就相当于创建了一个快捷方式,array2是array1的快捷方式

复制
public class ArrayTest {
    public static void main(String[] args) {
        int[] array1;
        int[] array2;
        //对array1赋值
        array1 = new int[]{2, 3, 5, 7, 11, 13, 17, 19};
        //数组的复制
        array2 = new int[array1.length];
        for (int i =0;i 
数组的反转 
public class ArrayTest {
    public static void main(String[] args) {
        String[] arr = new String[]{"JJ","DD","MM","BB","GG","AA"};

        //复制
        String[] arr1 = new String[arr.length];
        for (int i =0;i 
查找 
线性查找 
public class ArrayTest {
    public static void main(String[] args) {
        String[] arr = new String[]{"JJ","DD","MM","BB","GG","AA"};

        String dest = "BBA";
        boolean isFlag = true;
        //线性查找:
        for (int i = 0;i 
二分法查找 
public class ArrayTest {
    public static void main(String[] args) {
        String[] arr = new String[]{"JJ","DD","MM","BB","GG","AA"};

        String dest = "BBA";
        boolean isFlag = true;
        /*
        //线性查找:
        for (int i = 0;i
        // 二分法查找
        //前提:所要查找的数组必须有序
        int [] arr2 = new int[]{-98,-34,2,34,54,66,79,105,210,333};
        int dest2 = 686;
        int head = 0;
        int end = arr2.length-1;
        boolean isFlag2 = true;
        while (head <= end){
            int middle = (head + end)/2;
            if (dest2 == arr2[middle]){
                System.out.println("找到了指定的元素,位置为:"+middle);
                isFlag2 = false;
                break;
            }else if (arr2[middle] > dest2){
                end = middle -1;

            }
            else {
                head = middle+1;
            }


        }
        if(isFlag2){
            System.out.println("没找到");
        }
    }
}

排序

排序:假设含有n个记录的序列为{R1,R2,…,Rn},其相应的关键字序列为 {K1,K2,…,Kn}。将这些记录重新排序为{Ri1,Ri2,…,Rin},使得相应的关键 字值满足条Ki1<=Ki2<=…<=Kin,这样的一种操作称为排序。 通常来说,排序的目的是快速查找。

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

排序算法的分类

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

十大内部排序算法 选择排序

直接选择排序,堆排序

交换排序

冒泡排序,快速排序

插入排序

直接插入排序,折半插入排序、shell排序

归并排序

以上八种排序方法是比较常用的排序方式

桶式排序 基数排序 算法的五大特征

输入(input):有0个或多个输入数据,这些输入必须有清楚的描述和定义
输出(output):至少有1个或多个输出结果,不可以没有输出结果
有穷性(有限性,Finiteness):算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤
确定性(明确性,Definiteness):算法中的每一步都有确定的含义,不会出现二义性
可行性(有效性,Effectiveness):算法的每一步都是清楚且可行的,能让用户用纸笔计算而求出答案

说明:满足确定性的算法也称为:确定性算法。现在人们也关注更广泛的概念,例如 考虑各种非确定性的算法,如并行算法、概率算法等。另外,人们也关注并不要求终
止的计算描述,这种描述有时被称为过程(procedure)。

冒泡排序的实现

介绍: 冒泡排序的原理非常简单,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
排序思想:

    比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步 做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要
    比较为止。
public class ArrayTest {
    public static void main(String[] args) {
        int[] arr = new int[]{4, 32, 76, -98, 0, 64, 33, -21, 32, 99};

        //冒泡排序
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        for (int i = 0;i 
快速排序的实现 

介绍: 快速排序通常明显比同为O(nlogn)的其他算法更快,因此常被采用,而且快排采用了分治法的思想,所以在很多笔试面试中能经常看到快排的影子。可 见掌握快排的重要性。
快速排序(Quick Sort)由图灵奖获得者Tony Hoare发明,被列为20世纪十 大算法之一,是迄今为止所有内排序算法中速度最快的一种。冒泡排序的升级版,交换排序的一种。快速排序的时间复杂度为O(nlog(n))。

排序思想:

    从数列中挑出一个元素,称为"基准"(pivot)重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准 值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后, 该基准就处于数列的中间位置。这个称为分区(partition)操作。递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数 列排序。递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好 了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
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.从平均时间而言:快速排序最佳。但在最坏情况下时间性能不如堆排序和归 并排序。
2.从算法简单性看:由于直接选择排序、直接插入排序和冒泡排序的算法比较 简单,将其认为是简单算法。对于Shell排序、堆排序、快速排序和归并排序 算法,其算法比较复杂,认为是复杂排序。
3.从稳定性看:直接插入排序、冒泡排序和归并排序时稳定的;而直接选择排 序、快速排序、 Shell排序和堆排序是不稳定排序
4.从待排序的记录数n的大小看,n较小时,宜采用简单排序;而n较大时宜采
用改进排序。

排序算法的选择

(1)若n较小(如n≤50),可采用直接插入或直接选择排序。 当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直 接插入,应选直接选择排序为宜。
(2)若文件初始状态基本有序(指正序),则应选用直接插入、冒泡或随机的快速排 序为宜; (3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或
归并排序。

数组Arrays工具类的使用

java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比 如排序和搜索)的各种方法。
1 boolean equals(int[] a,int[] b) 判断两个数组是否相等。
2 String toString(int[] a) 输出数组信息。
3 void fill(int[] a,int val) 将指定值填充到数组之中。
4 void sort(int[] a) 对数组进行排序。
5 int binarySearch(int[] a,int key) 对排序后的数组进行二分法检索指定的值。

例子:
java.util.Arrays类的sort()方法提供了数组元素排序功能:

import java.util.Arrays; 
public class SortTest { 
	public static void main(String[] args){ 
		int [] numbers = {5,900,1,5,77,30,64,700}; 
		Arrays.sort(numbers); 
		for(int i = 0; i < numbers.length; i++){ 
			System.out.println(numbers[i]);
		}
	}
}
编程过程中数组的常见异常

1.数组脚标越界异常(ArrayIndexOutOfBoundsException)

int[] arr = new int[2]; 
System.out.println(arr[2]); 
System.out.println(arr[-1]);
访问到了数组中的不存在的脚标时发生。

2.空指针异常(NullPointerException)

int[] arr = null; 
System.out.println(arr[0]);
arr引用没有指向实体,却在操作实体中的元素时。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/727448.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号