Java核心基础(六)


本篇文章内容来自尚硅谷java核心基础免费课程的笔记整理(去掉了一些繁杂多余的内容)。
有零基础或者想看视频学习的可以去官网。
http://www.atguigu.com/
因为在深入学习公开的已知漏洞时发现自己的java功底不够。
于是又开了个新坑。


数组中涉及的常见算法

 1. 数组元素的赋值(杨辉三角、回形数等)
 2. 求数值型数组中元素的最大值、最小值、平均数、总和等
 3. 数组的复制、反转、查找(线性查找、二分法查找)
 4. 数组元素的排序算法

二分法查找算法

  有相关ACM比赛(有幸大学时期参加过)或者了解过算法的同学肯定知道这个著名的算法。所以话不多说,直接上代码,在代码中注释算法大致原理

//二分法查找:要求此数组必须是有序的。
int[] arr3 = new int[]{-99,-54,-2,0,2,33,43,256,999};
boolean isFlag = true; // 判定未找到相应数字的旗子(flag),默认未找到,找到及更改为false
int number = 256;
int head = 0;//首索引位置
int end = arr3.length - 1;//尾索引位置
while(head <= end){ //遍历区间(初始是0至length-1)
	int middle = (head + end) / 2;// 将整个区间一分为二,找到位于中间的数字,如果相等及找到
	if(arr3[middle] == number){
		System.out.println("找到指定的元素,索引为:" + middle);
		isFlag = false; //因为查找到相应数字,所以更改为false
		break;
	}else if(arr3[middle] > number){ //如果小于位于中间的数,就在0-中间数-1这个位置继续找
		end = middle - 1;
	}else{//arr3[middle] < number  //如果大于位于中间的数,就在中间数+1-length-1这个位置继续找
		head = middle + 1;
	}
}
if(isFlag){ //如果判定未找到的旗子(flag)还为true,即输出未找到
	System.out.println("未找打指定的元素");
}

排序算法

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

  通常来说,排序的目的是快速查找。

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

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

  十大内部排序

   选择排序
    直接选择排序、堆排序
   交换排序
    冒泡排序、快速排序
   插入排序
    直接插入排序、折半插入排序、Shell排序
   归并排序
   桶式排序
   基数排序

  算法的5大特征

算法的五大特征

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

  冒泡排序

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

  快速排序

   快速排序通常明显比同为O(nlogn)的其他算法更快,因此常被采用,而且快排采用了分治法的思想,所以在很多笔试面试中能经常看到快排的影子。可见掌握快排的重要性。

   快速排序(Quick Sort)由图灵奖获得者Tony Hoare发明,被列为20世纪十大算法之一,是迄今为止所有内排序算法中速度最快的一种。冒泡排序的升级版,交换排序的一种。快速排序的时间复杂度为O(nlog(n))。

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

  排序算法就到这儿大致了解一下。以后在深入javaweb时会继续深究。

Arrays工具类的使用

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

Arrays类常用方法

数组使用中的常见异常

  数组脚标越界异常(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引用没有指向实体,却在操作实体中的元素时。


文章作者: meta-taamr
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 meta-taamr !