本博客图片纯属网络资源若有雷同纯属巧合。
来源:百度图片。
本章主要对查找和排序的相关问题进行了讲解。并介绍了几种较为经常使用的查找和排序方法。
查找:从某个项目组中寻找指定目标元素,或者肯定该组中并不存在该目标元素。
查找池:对其查找的项目组。
从算法的角度来讲,咱们但愿最小化比较操做的次数。
9.1.1静态方法
静态方法又称类方法,能够经过类名来激活。能够没必要使用实例化来调用方法。声明方法时使用static修饰符就能够将方法声明为静态的。
泛型方法要建立泛型方法,只需在方法头的返回类型前插入一个泛型声明就能够了。例如php
public static <T extends Comparable<T> boolean> linearSearch (T[] data, int min, int max, T target)
9.1.3线性查找法
线性查找: 从该列表头开始一次比较每个值,知道找到该目标元素。
线性查找示意图
html
9.1.4 二分查找法
二分查找是从排序列表的中间开始查找,若是没有在那个中间元素找到目标元素,则继续查找。经过比较削减通常的查找池,剩下的一半查找池将表示为可行候选项,以相同方式继续查找,每一次比较都会将可行候选向削减一半,直至最终找到目标元素,或者再也不存在可行候选项。
二分查找示意图
9.2 排序
排序:基于某一标准,要么一圣墟要么已将徐将某一组项目按照某个规定顺序排列。
基于效率排序算法一般也分为两类:
顺序排序:他一般使用一对嵌套循环对n个元素排序,须要大约n²次比较;以及对数排序,它对n个元素进行排序一般须要大约nlog₂n次比较。
9.1.2 选择排序法
选择排序算法的通常策略以下:扫描整个列表以找到最小值。将这个值与该列表第一个位置处的值交换。扫描(除了第一个值的)剩余部分列表并找出最小值,而后将它和该列表第二个位置处的值进行交换。扫描(除了前两个值的)剩余部分列表并找出最小值,而后将它和该列表第三个位置处的值交换。对列表中每个位置继续该过程。当这一过程结束后,列表也就已经排好序了。
选择排序示意图
9.2.2 插入排序法
对列表的头两个值依据其相对大小对其及逆行排序,若是有必要则将它们互换。将列表的第三个值插入到头两个(已排序的)值中的恰当位置。而后将第四个值插入到列表头三个值中的正确位置。每作出一次插入,该排序子集中的值数目就会增长一个。继续这一过程,直至列表中的全部元素都获得彻底排序。
插入排序示意图:
9.2.3 冒泡排序法
扫描该队列且比较邻接元素,若是它们不是按相对顺序排列则将其互换。这就像把最大值“冒泡”到列表的最后位置,这是它在最终已排序列表中的恰当位置。而后再次扫描该列表,冒泡出倒数第二个值。继续这一过程,直至全部元素都被冒泡到它们正确的位置。
冒泡排序示意图:
java
9.2.4 快速排序法
首先选择一个列表元素做为分区元素。下一步,分割该列表,时的小于该分区元素的全部元素位于该元素的左边,全部大于该分区元素的元素位于有表。最后,将该快速排序策略(递归式)应用于两个分区。
快速排序法示意图:
git
9.2.5 归并排序法
首先将列表分为两个大约相等的部分,而后对每个部分列表递归调用其自身。继续该列表的递归分解,直至达到该递归的基本情形,这是该列表被分割成长度为1的列表。
归并排序法示意图:
9.3 基数排序法
基数排序的大体思路有点像投桶,就是将先按照个位搜集数据而后在按照十位数搜集数据以此类推最终按顺序输出。
web
问题:各类排序的应用场景
问题解决方案:
冒泡排序
冒泡排序重复地走访过要排序的数列,一次比较两个元素,若是他们的顺序错误就把他们交换过来。走访数列的工做是重复地进行直到没有再须要交换,也就是说排序完成。规模比较小的时候应用冒泡排序,主要应用于教学。。。
选择排序--只会移动N次
选择排序的主要思想:首先找到数组中最小的那个元素,其次,将它和第一个元素交换。接下来找第二小和第二个交换。运行时间和输入无关,数据移动最少。当数据量较小的时候适用。
插入排序
时间复杂度为O(n^2),数据量小时使用。而且大部分已经被排序。
快速排序
快速排序是最快的通用排序算法,在大多数实际状况中,快速排序是最佳选择。在java的默认排序中是使用的是三向切分排序。
归并排序
若是须要稳定,空间不是很重要,请选择归并。
O(n)时间复杂度的基数排序
当范围已经知道,并且空间不是很重要的状况下使用基数排序。
---------------------
做者:li563868273
来源:CSDN
原文:http://www.javashuo.com/article/p-ssgpslyy-gp.html
版权声明:本文为博主原创文章,转载请附上博文连接!算法
问题3解决方案:
我写了几个方法进行统计
数组
错题一解析:这道题说的是接口不能够派生接口,这是错的,我应该是看错了因此才选的true。网络
20172304郭恺同窗本次的博客十分优秀,对教材的总结详略得当,而又针对本身在教材中发现的问题进行了深刻的鞭辟入里的思考与解答。整个过程看起来赏心悦目给人一种美的享受。
20172328李馨雨同窗的博客十分的完整与丰富,体现了她认真的学习态度。数据结构
上周博客互评状况
20172301 郭恺同窗本次博客十分简洁,对教材的内容归纳的十分精炼,整体篇幅较短。
20172328 李馨雨同窗此次的博客中规中矩,没有特别出彩的地方,可是结构完整。函数
本周又通过了充分的学习与思考,整合与联系。又不断地充实了本身,但愿在老师的引领下,能学到更多更好的有用的知识。
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 30/30 | 1/1 | 10/10 | |
第二周 | 766/796 | 1/2 | 40/50 | |
第三周 | 817/1613 | 1/3 | 20/70 | |
第四周 | 1370/3983 | 2/5 | 30/100 | |
第五周 | 1235/5214 | 1/6 | 10/110 |
1.蓝墨云班课
2.java软件结构与数据结构
3.java如何计算运行程序时间
4.各类排序的应用场景