热门标签 | 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虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 本文介绍了在达梦数据库(DM7)中通过两种方法实现两表之间的联接更新操作,包括使用子查询的更新语句和MERGE语句的具体应用。 ... [详细]
  • 春季职场跃迁指南:如何高效利用金三银四跳槽季
    随着每年的‘金三银四’跳槽高峰期的到来,许多职场人士都开始考虑是否应该寻找新的职业机会。本文将探讨如何制定有效的职业规划、撰写吸引人的简历以及掌握面试技巧,助您在这关键时期成功实现职场跃迁。 ... [详细]
  • Python3爬虫入门:pyspider的基本使用[python爬虫入门]
    Python学习网有大量免费的Python入门教程,欢迎大家来学习。本文主要通过爬取去哪儿网的旅游攻略来给大家介绍pyspid ... [详细]
  • 使用Matlab创建动态GIF动画
    动态GIF图可以有效增强数据表达的直观性和吸引力。本文将详细介绍如何利用Matlab软件生成动态GIF图,涵盖基本代码实现与高级应用技巧。 ... [详细]
  • 深入探讨前端代码优化策略
    本文深入讨论了前端开发中代码优化的关键技术,包括JavaScript、HTML和CSS的优化方法,旨在提升网页加载速度和用户体验。 ... [详细]
  • Python 领跑!2019年2月编程语言排名更新
    根据最新的编程语言流行指数(PYPL)排行榜,Python 在2019年2月的份额达到了26.42%,稳坐榜首位置。 ... [详细]
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社区 版权所有