热门标签 | 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)。



推荐阅读
  • 网易严选Java开发面试:MySQL索引深度解析
    本文详细记录了网易严选Java开发岗位的面试经验,特别针对MySQL索引相关的技术问题进行了深入探讨。通过本文,读者可以了解面试官常问的索引问题及其背后的原理。 ... [详细]
  • 本文介绍了多个关于JavaScript的书籍资源、实用工具和编程实例,涵盖从入门到进阶的各个阶段,帮助读者全面提升JavaScript编程能力。 ... [详细]
  • 开发笔记:9.八大排序
    开发笔记:9.八大排序 ... [详细]
  • 本文详细介绍了如何在PHP中使用serialize()和unserialize()函数,以及它们在数据传输和存储中的应用。 ... [详细]
  • 本文介绍了Android开发中Intent的基本概念及其在不同Activity之间的数据传递方式,详细展示了如何通过Intent实现Activity间的跳转和数据传输。 ... [详细]
  • 本文探讨了如何使用自增和自减运算符遍历二维数组中的元素。通过实例详细解释了指针与二维数组结合使用的正确方法,并解答了常见的错误用法。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本文探讨了Java编程的核心要素,特别是其面向对象的特性,并详细介绍了Java虚拟机、类装载器体系结构、Java类文件和Java API等关键技术。这些技术使得Java成为一种功能强大且易于使用的编程语言。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • 本文详细解析了Java中hashCode()和equals()方法的实现原理及其在哈希表结构中的应用,探讨了两者之间的关系及其实现时需要注意的问题。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 深入理解一致性哈希算法及其应用
    本文详细介绍了分布式系统中的一致性哈希算法,探讨其原理、优势及应用场景,帮助读者全面掌握这一关键技术。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • 异常要理解Java异常处理是如何工作的,需要掌握一下三种异常类型:检查性异常:最具代表性的检查性异常是用户错误或问题引起的异常ÿ ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
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社区 版权所有