1.查找的定义

    查找是这样一个过程,即在某个项目组中寻找某一指定目标元素,或者确定该组中并不存在该目标元素。 对其进行查找的项目的组有时也成为查找池。两种常见的查找方式:线性查找和二分查找。为了能够查找某一对象,我们就必须将一个对象跟另一个对象进行比较。我们对这些算法的实现就是对某个Comparable对象的数组进行查找。因此,所涉及的元素实现了Comparable接口且彼此是可比较的。我们将在Searching类头中完成这一限制。

2.算法查找

2.1 线性查找

/*** 线性查找 在没有找到之前 需要一直遍历* * @param data* @param min* @param max* @param target* @return*/public static <T extends Comparable<T>> boolean linearSearch(T[] data,int min, int max, T target) {int index = min;boolean found = false;while (!found && index <= max) {found = data[index].equals(target);index++;}return false;}

2.2 二分查找

/*** 二分查找:二分查找需要实现数组列表有序,然后每次考察中间元素,排除一半,最好的方法是使用递归实现。* @param data* @param min* @param max* @param target* @return* * 二分查找方法是递归实现的,如果没有找到目标元素,且有更多待查找数据,则该方法将调用自身,同时传递参数,* 这些参数缩减了数组内可行候选项的规模。* * min和max索引用于确定是否还具有更多的待查找数据,这就是说,如果削减后的查找区间一个元素没有则该方法* 不会调用其自身且返回一个false值。* * * */public static <T extends Comparable<? super T>> boolean binarySearch(T[] data, int min, int max, T target) {boolean flag= false;int mid = (max+min)/2;if(data[mid].compareTo(target)==0){flag = true;}else if(data[mid].compareTo(target)>0){//中间大于目标if(min<=mid-1){flag = binarySearch(data, min, mid-1, target);}}else if(data[mid].compareTo(target)<0){if(mid+1<=max){flag = binarySearch(data, mid+1, max, target);}}return flag;}

2.3 查找比较
线性查找,最好情形是目标元素刚好是我们考察项目组的第一个项目。最糟糕的情形是出现在目标不再该组的时候,且在我们确定它不在之前不得不考察每一个元素。算法的期望是n/2,因此线性查找算法具有线性时间复杂度O(n)。
二分查找,因为我们每比较一回我们就能够将剩余数据削减一半,所以我们可以更快的找到元素。最好的情况一次找到,最差是排除所有元素,我们不得不进行log2n 次比较。因此,找到位于该查找池中某一元素的预期情形是大约(log2n)/2次比较。

线性查找比较简单,编程调试更容易实现。
线性查找无需花费额外成本来排序该查找列表。
二分查找的复杂度是对数级的,这使得它对于大型查找池非常有效率。

3.排序简介

排序:基于某一个标准,将某一组项目按照某个规定顺序排列。
基于效率排序算法通常分为两类:顺序排序和对数排序。
顺序排序:它通常使用一对嵌套循环对n个元素进行排序,需要大约n2 次比较。
对数排序:它对n个元素进行排序大约需要nlog2n 次比较。
在n较小的时候,这两类算法之间几乎不存在任何实际差别。

4.泛型:补充资料

package ds.java.ch09;import java.util.ArrayList;
import java.util.Collection;
import java.util.List;/*** @author LbZhang* @version 创建时间:2015年11月19日 上午11:16:20* @description 类说明* * 综合分析:* extends 可用于的返回类型限定,不能用于参数类型限定。* super 可用于参数类型限定,不能用于返回类型限定。* * 带有super超类型限定的通配符可以向泛型对易用写入,带有extends子类型限定的通配符可以向泛型对象读取.*/
public class Genertic {public static void main(String[] args) {/*** List<? extends Frut> 表示 “具有任何从Fruit继承类型的列表”,编译器无法确定List所持有的类型,* 所以无法安全的向其中添加对象。可以添加null,因为null 可以表示任何类型。所以List 的add 方法不能* 添加任何有意义的元素,但是可以接受现有的子类型List<Apple> 赋值。*/List<? extends Fruit> felist = new ArrayList<Apple>();//flist.add(new Apple());Fruit f = felist.get(0);/*** List<? super Fruit> 表示“具有任何Fruit超类型的列表”,列表的类型至少是一个 Fruit 类型,* 因此可以安全的向其中添加Fruit 及其子类型。由于List<? super Fruit>中的类型可能是任何Fruit* 的超类型,无法赋值为Fruit的子类型Apple的List<Apple>.* */List<? super Fruit> fslist = new ArrayList<Fruit>();fslist.add(new Apple());//Fruit fs = fslist.get(0);}}class Food {}class Fruit extends Food {}class Apple extends Fruit {}class RedApple extends Apple {}

总结:
extends 可用于的返回类型限定,不能用于参数类型限定。
super 可用于参数类型限定,不能用于返回类型限定。

带有super超类型限定的通配符可以向泛型对易用写入,带有extends子类型限定的通配符可以向泛型对象读取。——《Core Java》

转载于:https://www.cnblogs.com/mrzhang123/p/5365832.html

数据结构(Java)——查找和排序(1)相关推荐

  1. java 查找排序_数据结构(Java)——查找和排序(1)

    1.查找的定义 查找是这样一个过程,即在某个项目组中寻找某一指定目标元素,或者确定该组中并不存在该目标元素. 对其进行查找的项目的组有时也成为查找池. 两种常见的查找方式:线性查找和二分查找. 为了能 ...

  2. 数据结构:查找与排序

    查找 查找的基本概念 查找是指,在数据结构中寻找满足给定条件的数据元素,也成为检索或搜索 1.查找条件.查找操作和查找结果 查找条件:数据元素(包含关键字key). 查找操作:比较元素相等,T类的eq ...

  3. 数据结构(java版)SortedSeqList(排序顺序表)

    SortedSeqList(排序顺序表) 代码部分: public class SortedSeqList<T extends Comparable<? super T>> e ...

  4. 【数据结构】查找与排序

    文章目录 考点分析 顺序查找 折半查找 分块查找 散列表 散列函数的构造方法 处理冲突的方法 小结 八大排序 插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 考点分析 ...

  5. 数据结构之查找与排序

    查找 静态查找:查找时,只查找读取 顺序表上查找 无序表上查找,设置位置0为岗哨,从后往前查找,查找长度为(n+1)/2 有序表上查找,使用二分查找,平均查找长度为 log2(n+1)-1 索引顺序表 ...

  6. 数据结构Java版之排序算法(二)

    排序按时间复杂度和空间复杂度可分为 低级排序 和 高级排序 算法两种.下面将对排序算法进行讲解,以及样例的展示. 低级排序:冒泡排序.选择排序.插入排序. 冒泡排序: 核心思想,小的数往前移.假设最小 ...

  7. 数据结构java学生成绩排序_数据结构学习--Java简单排序

    冒泡排序需要元素每次遍历都从最底部向上冒泡,找到适合的位置后,该位置之后的元素继续向上冒,这样一趟排序结束后,将冒出最大或者最小值. 选择排序需要元素从0号位开始向上遍历一遍,并将最小值放到0号位上, ...

  8. java 内置排序函数_java排序函数

    7. 数组排序 函数:Arrays.sort(); [java] view pl... 在 caller 的实例中,将实现了 A 接口的对象的引用传给 caller,后调用 call()方法; 注意: ...

  9. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

最新文章

  1. 高分文章精选 | 纳米孔宏基因组测序的表现
  2. 开源 免费 java CMS - FreeCMS-标签 channelList .
  3. 卧底各大程序员圈,才知道什么才是牛逼的程序员!
  4. C++实现有序表折半查找
  5. 休眠事实:始终检查Criteria API SQL查询
  6. cmd命令 - vue项目:单独安装vue-router
  7. Kubernetes-Ingress(十九)
  8. 序号47指标横向展示.xlsx_电力监控系统安全防护规定Akey310参数指标
  9. 关于企业应用SAP成本管理模式与方法的一些思考
  10. Blender Reference Manual 欢迎使用Blender手册!
  11. Git:git合并分支
  12. 【移动安全基础篇】——02、APP内付破解
  13. 啦啦啦啦啦啦啦啦啦啦啦啦这是一篇分界线
  14. codewars练习(javascript)-2021/3/23
  15. Web APIs day6 | 正则阶段案例
  16. Windows XP系统下建立V-PN服务器
  17. cad引出线段lisp_lisp将多条线条合并成一条多段线
  18. C++通过调用Python函数调用讯飞OCR识别接口
  19. vscode中使用prettier后html,css格式化不生效的问题
  20. 全网分析HTTP协议最全的一篇文章,程序员赶紧收藏

热门文章

  1. 距离高考出成绩,一年了、、、
  2. 虚拟机安装Linux(vmware + ubuntu)
  3. mysql可以存储标点么_MySQL查询(进阶)(每个标点都是重点)
  4. 100转换成二进制 java,一段简单的java代码,十进制转二进制
  5. 重物码垛搬运机器人_节卡机器人:5G下的智慧物流——柔性生产物流系统
  6. c语言函数大全语法下载,C语言函数大全(语法).doc
  7. Java游戏有易筋经_易筋经- JavaWeb-1
  8. Linux内核OOM机制的详细分析
  9. CRegKey 注册表操作
  10. 推荐系统(5)-深度推荐模型-AutoRec、DeepCrossing、NeuralCF、PNN、WideDeep、FNN、DeepFM、NFM