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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GetProcAddress()用法

函数功能描述: GetProcAddress()函数检索指定的动态链接库(DLL)中的输出库函数地址。 函数原型&#xff1a; FARPROC GetProcAddress( HMODULE hModule, // DLL模块句柄 LPCSTR lpProcName // 函数名 ); 参数&#xff1a; hModule [in] 包含此函数的…

支付宝问题LaunchServices: ERROR: There is no registered handler for URL scheme alipay

LaunchServices: ERROR: There is no registered handler for URL scheme alipay &#xff08;这句话其实是在告诉你 设备上没有安装 支付宝的客户端,此时会走网页端&#xff09;而有人会发现并没有HTML5网页弹出过一会&#xff0c;会发现服务器返回4000支付失败&#xff0c;这…

C++string类常用函数 c++中的string常用函数用法总结

string类的构造函数&#xff1a; string(const char *s); //用c字符串s初始化 string(int n,char c); //用n个字符c初始化 此外&#xff0c;string类还支持默认构造函数和复制构造函数&#xff0c;如string s1&#xff1b;string s2"hello"&#xff1b;都是正…

排列与组合

话说&#xff0c;初一的时候看到这样一道题&#xff1a;有一种彩票中奖率为1%&#xff0c;买一百张是不是一定能中奖&#xff1f;答案自然是否定的&#xff0c;但我在想&#xff0c;如果有200张彩票&#xff0c;两张有奖&#xff0c;买一百张中奖率是多少&#xff1f;一天晚上睡…

剔除服务器返回的NSNull格式的数据

服务器返回NSNull格式的数据&#xff0c;真。。的烦人 解决办法&#xff1a;在AFN请求里面加上下面两段代码&#xff0c;OK AFJSONResponseSerializer *response (AFJSONResponseSerializer *)manager.responseSerializer; response.removesKeysWithNullValues YES;

显式(静态)调用: LIB + DLL + .H

1、编程时用ad.h,ad.lib,放在项目当前目录里2、在头文件中加入#include "ad.h"3、在Project Setting–>Link–>Object/library modules加入ad.lib执行时将ad.dll跟你的程序放在同一目录。 就可以直接调用dll中的函数了 当前目录 转载于:https://www.cnblogs.co…

boost Mutex

写过多线程程序的人都知道&#xff0c;不能让多个线程同时访问共享的资源是至关重要的。 假如一个线程试图改变共享数据的值&#xff0c;而另外一个线程试图去读取该共享数据的值&#xff0c;结果将是未定义的。 为了阻止这样的事情发生&#xff0c;需要用到一些非凡的原始数据…

接入支付宝出现交易订单处理失败,请稍后再试(ALI64)的错误

上次在接入支付宝的时候就碰到了交易订单处理失败&#xff0c;请稍后再试&#xff08;ALI64&#xff09;这样的错误&#xff0c;后来经过排查和总结&#xff0c;一般来讲这种问题都是公钥和私钥没有正确配置造成的。支付宝这边为了保证数据在传输时不被篡改&#xff0c;使用了r…

c中session的用法

c中session的用法你知道吗&#xff1f;下面小编就跟你们详细介绍下c中session的用法&#xff0c;希望对你们有用。c中session的用法如下&#xff1a;Session的基本属性&#xff1a;一、属性1、SessionIDSessionID 属性返回用户的会话标识。在创建会话时&#xff0c;服务器会为每…

查看硬件信息

测试机器的硬件信息&#xff1a; 查看CPU信息&#xff08;型号&#xff09; # cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 8 Intel(R) Xeon(R) CPU E5410 2.33GHz (看到有8个逻辑CPU, 也知道了CPU型号) # cat /proc/cpuinfo | grep physical …

支付宝集成交互流程

交互流程 功能流程 流程说明&#xff08;以Android平台为例&#xff09;&#xff1a; 第4步&#xff1a;调用支付接口&#xff1a;此消息就是本接口所描述的开发包提供的支付对象PayTask&#xff0c;将商户签名后的订单信息传进pay方法唤起支付宝收银台&#xff0c;订单格式具体…

VxLAN基础

转自&#xff1a;http://blog.csdn.net/freezgw1985/article/details/16354897 一 . 为什么需要Vxlan1. vlan的数量限制4096个vlan远不能满足大规模云计算数据中心的需求2. 物理网络基础设施的限制基于IP子网的区域划分限制了需要二层网络连通性的应用负载的部署3. TOR交换机MA…

find_first_of()和 find_last_of() 【获取路径、文件名】

string 类提供字符串处理函数&#xff0c;利用这些函数&#xff0c;程序员可以在字符串内查找字符&#xff0c;提取连续字符序列(称为子串)&#xff0c;以及在字符串中删除和添加。我们将介绍一些主要函数。 1.函数find_first_of()和 find_last_of() 执行简单的模式匹配&#x…

支付宝集成

memo Error Domain系统繁忙&#xff0c;请稍后再试 Code1000 "(null)" reslut {memo "Error Domain\U7cfb\U7edf\U7e41\U5fd9\Uff0c\U8bf7\U7a0d\U540e\U518d\U8bd5 Code1000 \"(null)\"";result "";resultStatus 4000;} 请问安装…

servlet中实现页面跳转return “r:”和return “f:

servlet中实现页面跳转return “r&#xff1a;”和return “f&#xff1a;”的区别和作用 分享| 2015-07-28 14:22741830480 | 浏览 48 次Pascal2015-07-28 14:26 #知道行家专业创造价值&#xff0c;火热招募中&#xff01;#提问者采纳热心网友r是redirect重定向&#xff0c;参…

多线程编程 RW_LOCK 读写锁

RW锁 读写锁&#xff0c;也叫共享独占锁 互斥量 要么是锁住状态&#xff0c;要么是不加锁状态&#xff0c;而且一次只有一个线程可以对其加锁。 读写锁可以有三种状态&#xff0c;读模式下加锁状态&#xff0c;写模式下加锁状态&#xff0c;不加锁状态。一次只有一个线程可以占…

Error Domain=NSCocoaErrorDomain Code=3840 JSON text did not start with array or object and option

数据请求失败 报错 Error DomainNSCocoaErrorDomain Code3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo{NSDebugDescriptionJSON text did not start with array or object and option to allow fragm…

vim学习笔记(4)帮助与配置

使用帮助 在Vim中输入命令&#xff1a;help&#xff0c;即可进入帮助界面&#xff0c;默认是英文&#xff0c;可以通过以下方式安装中文帮助&#xff08;以vimcdoc-1.9.0为例&#xff09;&#xff1a; 1、下载中文帮助的文件压缩包 2、解压 tar -xzvf vimcdoc-1.9.0.tar.gz 3、…

C语言程序代码优化

我认为一个好的用于科学计算的程序代码应该&#xff1a;算法漂亮精妙&#xff0c;程序简洁易懂&#xff0c;运算快速&#xff0c;节省内存。这里有的地方是矛盾的&#xff0c;比如简洁vs易懂&#xff0c;时间vs空间&#xff0c;找个平衡吧。目前来看时间要比空间宝贵一些。写程…

微信支付不回调支付成功的方法,这是为什么

如果你是Xcode7.2&#xff0c;或者IOS9.2的话&#xff0c;可能会遇见在微信客户端操作返回程序之后不能执行微信的onResp回调方法的问题&#xff0c;就是因为一下这两个方法被废弃掉了&#xff0c;所以我的新demo替换了一个新的方法在下面。就完美解决这个问题了&#xff08;并…