Array[]数组(java)

Array[]数组

1、概述

  • 数组(Array), 是多个相同类型数据一定顺序排列的集合, 并使用一个名字命名, 并通过编号的方式对这些数据进行统一管理。

2、注意点

  • 数组本身是引用数据类型, 而数组中的元素可以是任何数据类型, 包括基本数据类型和引用数据类型。
  • 创建数组对象会在内存中开辟一整块连续的空间, 而数组名中引用的是这块连续空间的首地址。
  • 数组的长度一旦确定, 就不能修改。 数组一旦初始化,其长度是不可变的 。
  • 我们可以直接通过下标(或索引)的方式调用指定位置的元素, 速度很快。
  • 数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化。
    • 对于基本数据类型而言,默认初始化值各有不同
    • 对于引用数据类型而言,默认初始化值为null(注意与0不同! )

3、数组中常用的排序算法

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

    排序思想:

    1、比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。

    2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

    3、针对所有的元素重复以上的步骤,除了最后一个。

    4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较为止。

    public class BubbleSort {
    	public static void bubbleSort(int[] data) {
    		System.out.println("开始排序");
    		int arrayLength = data.length;
    		for (int i = 0; i < arrayLength - 1; i++) {
    			boolean flag = false;
    			for (int j = 0; j < arrayLength - 1 - i; j++) {
    				if (data[j] > data[j + 1]) {
    					int temp = data[j + 1];
    					data[j + 1] = data[j];
    					data[j] = temp;
    					flag = true;
    				}
    			}
    			System.out.println(java.util.Arrays.toString(data));
    			if (!flag)
    				break;
    		}
    	}
    
    	public static void main(String[] args) {
    		int[] data = { 9, -16, 21, 23, -30, -49, 21, 30, 30 };
    		System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
    		bubbleSort(data);
    		System.out.println("排序之后:\n" + java.util.Arrays.toString(data));
    	}
    }
    
  2. 快速排序:快速排序通常明显比同为O(nlogn)的其他算法更快,因此常被采用,而且快排采用了分治法的思想,所以在很多笔试面试中能经常看到快排的影子。可见掌握快排的重要性。

    排序思想:

    1、从数列中挑出一个元素,称为"基准"(pivot),

    2、重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

    3、递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

    4、递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(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));
    	}
    }
    

4、常见异常

数组脚标越界异常(ArrayIndexOutOfBoundsException)

int[] arr = new int[2];

System.out.println(arr[2]);//访问到了数组中的不存在的脚标时发生异常。 

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

空指针异常(NullPointerException)

int[] arr = null;
System.out.println(arr[0]);//arr引用没有指向实体,却在操作实体中的元素时,发生异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值