热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java二分法模糊匹配_程序员必须知道的8大排序和3大查找

Java程序员appv2.3.0官网安卓版类型:教育学习大小:8.6M语言:中文评分:10.0标签:立即下载每

b8645d0fa61d3d7fc44291e5884400a1.png

Java程序员appv2.3.0 官网安卓版

类型:教育学习大小:8.6M语言:中文 评分:10.0

标签:

立即下载

每天都在叫嚣自己会什么技术,什么框架,可否意识到你每天都在被这些新名词、新技术所迷惑,.NET、XML等等技术固然诱人,可是如果自己的基础不扎实,就像是在云里雾里行走一样,只能看到眼前,不能看到更远的地方。这些新鲜的技术掩盖了许多底层的原理,要想真正的学习技术还是走下云端,扎扎实实的把基础知识学好,有了这些基础,要掌握那些新技术也就很容易了。

要编写出优秀的代码同样要扎实的基础,如果排序和查找算法学的不好,怎么对程序的性能进行优化?废话不多说,本文要介绍的这些排序算法就是基础中的基础,程序员必知!

a0058b27102fdf73ad967a8873131028.png

1、直接插入排序

(1)基本思想:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排

好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数

也是排好顺序的。如此反复循环,直到全部排好顺序。

(2)实例

141e3c131a5bcba231b06d7913b37350.png

2、希尔排序(也称最小增量排序)

(1)基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。

(2)实例:

623955250f10ef1159afae8487f78cd4.png

3、简单选择排序

(1)基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;

然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

(2)实例:

044d01901aa257bca56dc70be831117a.png

4、堆排序

(1)基本思想:堆排序是一种树形选择排序,是对直接选择排序的有效改进。

堆的定义如下&#xff1a;具有n个元素的序列(h1,h2,...,hn),当且仅当满足(hi>&#61;h2i,hi>&#61;2i&#43;1)或(hi<&#61;h2i,hi<&#61;2i&#43;1)(i&#61;1,2,...,n/2)时称之为堆。在这里只讨论满足前者条件的堆。由堆的定义可以看出&#xff0c;堆顶元素(即第一个元素)必为最大项(大顶堆)。完全二叉树可以很直观地表示堆的结构。堆顶为根&#xff0c;其它为左子树、右子树。初始时把要排序的数的序列看作是一棵顺序存储的二叉树&#xff0c;调整它们的存储序&#xff0c;使之成为一个堆&#xff0c;这时堆的根节点的数最大。然后将根节点与堆的最后一个节点交换。然后对前面(n-1)个数重新调整使之成为堆。依此类推&#xff0c;直到只有两个节点的堆&#xff0c;并对它们作交换&#xff0c;最后得到有n个节点的有序序列。从算法描述来看&#xff0c;堆排序需要两个过程&#xff0c;一是建立堆&#xff0c;二是堆顶与堆的最后一个元素交换位置。所以堆排序有两个函数组成。一是建堆的渗透函数&#xff0c;二是反复调用渗透函数实现排序的函数。

(2)实例&#xff1a;

初始序列&#xff1a;46,79,56,38,40,84

建堆&#xff1a;

c9f9c86c513ba506393d99227a739a93.png

交换&#xff0c;从堆中踢出最大数

148ebf14fe9609a97729c9442baecdda.png

剩余结点再建堆&#xff0c;再交换踢出最大数

5603d884056a453184d89f2433305a24.png

依次类推&#xff1a;最后堆中剩余的最后两个结点交换&#xff0c;踢出一个&#xff0c;排序完成。

5、冒泡排序

(1)基本思想&#xff1a;在要排序的一组数中&#xff0c;对当前还未排好序的范围内的全部数&#xff0c;自上而下对相邻的两个数依次进行比较和调整&#xff0c;让较大的数往下沉&#xff0c;较小的往上冒。即&#xff1a;每当两相邻的数比较后发现它们的排序与排序要求相反时&#xff0c;就将它们互换。

(2)实例&#xff1a;

2935b52181c4b052e57d21f09af0e344.png

6、快速排序

(1)基本思想&#xff1a;选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描&#xff0c;将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

(2)实例&#xff1a;

7079541d9dc2369fa7b42329bf184abb.png

上图中将待排序列分成两部分,一部分比基准元素小,一部分大于基准元素,然后对这两部分重复上图的求解过程。

(这只是快速排序的一种实现方式&#xff0c;个人认为比较容易理解)

7、归并排序

(1)基本排序&#xff1a;归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表&#xff0c;即把待排序序列分为若干个子序列&#xff0c;每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

(2)实例&#xff1a;

92e6c75f6fed9d971c4ca622fd871f4a.png

8、基数排序

(1)基本思想&#xff1a;将所有待比较数值(正整数)统一为同样的数位长度&#xff0c;数位较短的数前面补零。然后&#xff0c;从最低位开始&#xff0c;依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

(2)实例&#xff1a;

b9356ea3d926119191f4b1a3d276af0e.png

稳定性说明&#xff1a;排序前&#xff0c;2(或者更多)个相等的数在序列的前后位置顺序和排序后它们在序列中的前后位置顺序一样。

实例&#xff1a;

待排序数列&#xff1a;5,4,8,6,1,8,7,9

排序结果&#xff1a;1,4,5,6,7,8,8,9

稳定&#xff1a;1,4,5,6,7,8,8,9

不稳定&#xff1a;1,4,5,6,7,8,8,9

说明&#xff1a;对比红色的8和紫色的8&#xff0c;看他们排序前后的位置。排序前&#xff0c;红8在紫8前面&#xff0c;如果排序后红8仍然在紫8前面&#xff0c;则排序算法稳定&#xff0c;否则不稳定。

现在我们分析一下8种排序算法的稳定性。

(请网友结合前面的排序基本思想来理解排序的稳定性(8种排序的基本思想已经在前面说过&#xff0c;这里不再赘述)不然可能有些模糊)

(1)直接插入排序&#xff1a;一般插入排序&#xff0c;比较是从有序序列的最后一个元素开始&#xff0c;如果比它大则直接插入在其后面&#xff0c;否则一直往前比。如果找到一个和插入元素相等的&#xff0c;那么就插入到这个相等元素的后面。插入排序是稳定的。

(2)希尔排序&#xff1a;希尔排序是按照不同步长对元素进行插入排序&#xff0c;一次插入排序是稳定的&#xff0c;不会改变相同元素的相对顺序&#xff0c;但在不同的插入排序过程中&#xff0c;相同的元素可能在各自的插入排序中移动&#xff0c;稳定性就会被破坏&#xff0c;所以希尔排序不稳定。

(3)简单选择排序&#xff1a;在一趟选择&#xff0c;如果当前元素比一个元素小&#xff0c;而该小的元素又出现在一个和当前元素相等的元素后面&#xff0c;那么交换后稳定性就被破坏了。光说可能有点模糊&#xff0c;来看个小实例&#xff1a;858410&#xff0c;第一遍扫描&#xff0c;第1个元素8会和4交换&#xff0c;那么原序列中2个8的相对前后顺序和原序列不一致了&#xff0c;所以选择排序不稳定。

(4)堆排序&#xff1a;堆排序的过程是从第n/2开始和其子节点共3个值选择最大(大顶堆)或者最小(小顶堆),这3个元素之间的选择当然不会破坏稳定性。但当为n/2-1, n/2-2, ...这些父节点选择元素时&#xff0c;有可能第n/2个父节点交换把后面一个元素交换过去了&#xff0c;而第n/2-1个父节点把后面一个相同的元素没有交换&#xff0c;所以堆排序并不稳定。

(5)冒泡排序&#xff1a;由前面的内容可知&#xff0c;冒泡排序是相邻的两个元素比较&#xff0c;交换也发生在这两个元素之间&#xff0c;如果两个元素相等&#xff0c;不用交换。所以冒泡排序稳定。

(6)快速排序&#xff1a;在中枢元素和序列中一个元素交换的时候&#xff0c;很有可能把前面的元素的稳定性打乱。还是看一个小实例&#xff1a;6 4 4 5 4 7 8  9&#xff0c;第一趟排序&#xff0c;中枢元素6和第三个4交换就会把元素4的原序列破坏&#xff0c;所以快速排序不稳定。

(7)归并排序&#xff1a;在分解的子列中&#xff0c;有1个或2个元素时&#xff0c;1个元素不会交换&#xff0c;2个元素如果大小相等也不会交换。在序列合并的过程中&#xff0c;如果两个当前元素相等时&#xff0c;我们把处在前面的序列的元素保存在结果序列的前面&#xff0c;所以&#xff0c;归并排序也是稳定的。

(8)基数排序&#xff1a;是按照低位先排序&#xff0c;然后收集&#xff1b;再按照高位排序&#xff0c;然后再收集&#xff1b;依次类推&#xff0c;直到最高位。有时候有些属性是有优先级顺序的&#xff0c;先按低优先级排序&#xff0c;再按高优先级排序&#xff0c;最后的次序就是高优先级高的在前&#xff0c;高优先级相同的低优先级高的在前。基数排序基于分别排序&#xff0c;分别收集&#xff0c;所以是稳定的。

8种排序的分类&#xff0c;稳定性&#xff0c;时间复杂度和空间复杂度总结&#xff1a;

a8e96d13209be3b589a30041fc827195.png

三种查找算法:顺序查找&#xff0c;二分法查找(折半查找)&#xff0c;分块查找&#xff0c;散列表(以后谈)

f19c5bf492f444f4c7bd8734317137d7.png

一、顺序查找的基本思想&#xff1a;

从表的一端开始&#xff0c;顺序扫描表&#xff0c;依次将扫描到的结点关键字和给定值(假定为a)相比较&#xff0c;若当前结点关键字与a相等&#xff0c;则查找成功&#xff1b;若扫描结束后&#xff0c;仍未找到关键字等于a的结点&#xff0c;则查找失败。

说白了就是&#xff0c;从头到尾&#xff0c;一个一个地比&#xff0c;找着相同的就成功&#xff0c;找不到就失败。很明显的缺点就是查找效率低。

适用于线性表的顺序存储结构和链式存储结构。

65005cf5d702053d47851d86293926a6.png

计算平均查找长度。

例如上表&#xff0c;查找1&#xff0c;需要1次&#xff0c;查找2需要2次&#xff0c;依次往下推&#xff0c;可知查找16需要16次&#xff0c;

可以看出&#xff0c;我们只要将这些查找次数求和(我们初中学的&#xff0c;上底加下底乘以高除以2)&#xff0c;然后除以结点数&#xff0c;即为平均查找长度。

设n&#61;节点数

平均查找长度&#61;(n&#43;1)/2

二、二分法查找(折半查找)的基本思想&#xff1a;

前提&#xff1a;

(1)确定该区间的中点位置&#xff1a;mid&#61;(low&#43;high)/2

min代表区间中间的结点的位置&#xff0c;low代表区间最左结点位置&#xff0c;high代表区间最右结点位置

(2)将待查a值与结点mid的关键字(下面用R[mid].key)比较&#xff0c;若相等&#xff0c;则查找成功&#xff0c;否则确定新的查找区间&#xff1a;

如果R[mid].key>a&#xff0c;则由表的有序性可知&#xff0c;R[mid].key右侧的值都大于a&#xff0c;所以等于a的关键字如果存在&#xff0c;必然在R[mid].key左边的表中。这时high&#61;mid-1

如果R[mid].key

如果R[mid].key&#61;a&#xff0c;则查找成功。

(3)下一次查找针对新的查找区间&#xff0c;重复步骤(1)和(2)

(4)在查找过程中&#xff0c;low逐步增加&#xff0c;high逐步减少&#xff0c;如果high

2708d5e468935474db7b71dcbc9678ff.png

平均查找长度&#61;Log2(n&#43;1)-1

注&#xff1a;虽然二分法查找的效率高&#xff0c;但是要将表按关键字排序。而排序本身是一种很费时的运算&#xff0c;所以二分法比较适用于顺序存储结构。为保持表的有序性&#xff0c;在顺序结构中插入和删除都必须移动大量的结点。因此&#xff0c;二分查找特别适用于那种一经建立就很少改动而又经常需要查找的线性表。

三、分块查找的基本思想&#xff1a;

二分查找表使分块有序的线性表和索引表(抽取各块中的最大关键字及其起始位置构成索引表

)组成&#xff0c;由于表是分块有序的&#xff0c;所以索引表是一个递增有序表&#xff0c;因此采用顺序或二分查找索引表&#xff0c;以确定待查结点在哪一块&#xff0c;由于块内无序&#xff0c;只能用顺序查找。

46fdb10a0f19d400b5325e90eb9b7d42.png

设表共n个结点&#xff0c;分b块&#xff0c;s&#61;n/b

(分块查找索引表)平均查找长度&#61;Log2(n/s&#43;1)&#43;s/2

(顺序查找索引表)平均查找长度&#61;(S2&#43;2S&#43;n)/(2S)

注&#xff1a;分块查找的优点是在表中插入或删除一个记录时&#xff0c;只要找到该记录所属块&#xff0c;就在该块中进行插入或删除运算(因块内无序&#xff0c;所以不需要大量移动记录)。它主要代价是增加一个辅助数组的存储控件和将初始表分块排序的运算。

它的性能介于顺序查找和二分查找之间。

四、最近比较忙&#xff0c;后续找个时间还会谈谈散列表(哈希表)技术&#xff0c;希望大家关注&#xff01;

散列表查找技术不同于顺序查找、二分查找、分块查找。它不以关键字的比较为基本操作&#xff0c;采用直接寻址技术。在理想情况下&#xff0c;无须任何比较就可以找到待查关键字&#xff0c;查找的期望时间为O(1)。



推荐阅读
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
author-avatar
手机用户2502855967
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有