分享好友 最新动态首页 最新动态分类 切换频道
java 数据摊平
2024-12-26 19:03


java 数据摊平

  作者 |  低吟不作语


八种排序算法可以按照如图分类

所谓交换,就是序列中任意两个元素进行比较,根据比较结果来交换各自在序列中的位置,以此达到排序的目的。

1. 冒泡排序

冒泡排序是一种简单的交换排序算法,以升序排序为例,其核心思想是:

  1. 从第一个元素开始,比较相邻的两个元素。如果第一个比第二个大,则进行交换。
  2. 轮到下一组相邻元素,执行同样的比较操作,再找下一组,直到没有相邻元素可比较为止,此时最后的元素应是最大的数。
  3. 除了每次排序得到的最后一个元素,对剩余元素重复以上步骤,直到没有任何一对元素需要比较为止。

用 Java 实现的冒泡排序如下

2. 快速排序

快速排序的思想很简单,就是先把待排序的数组拆成左右两个区间,左边都比中间的基准数小,右边都比基准数大。接着左右两边各自再做同样的操作,完成后再拆分再继续,一直到各区间只有一个数为止。

举个例子,现在我要排序 4、9、5、1、2、6 这个数组。一般取首位的 4 为基准数,第一次排序的结果是:

2、1、4、5、9、6

可能有人觉得奇怪,2 和 1 交换下位置也能满足条件,为什么 2 在首位?这其实由实际的代码实现来决定,并不影响之后的操作。以 4 为分界点,对 2、1、4 和 5、9、6 各自排序,得到:

1、2、4、5、9、6

不用管左边的 1、2、4 了,将 5、9、6 拆成 5 和 9、6,再排序,至此结果为:

1、2、4、5、6、9

为什么把快排划到交换排序的范畴呢?因为元素的移动也是靠交换位置来实现的。算法的实现需要用到递归(拆分区间之后再对每个区间作同样的操作)

用 Java 实现的快速排序如下

插入排序是一种简单的排序方法,其基本思想是将一个记录插入到已经排好序的有序表中,使得被插入数的序列同样是有序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程。

1. 直接插入排序

直接插入排序就是插入排序的粗暴实现。对于一个序列,选定一个下标,认为在这个下标之前的元素都是有序的。将下标所在的元素插入到其之前的序列中。接着再选取这个下标的后一个元素,继续重复操作。直到最后一个元素完成插入为止。我们一般从序列的第二个元素开始操作。

用 Java 实现的算法如下:

2. 希尔排序

某些情况下直接插入排序的效率极低。比如一个已经有序的升序数组,这时再插入一个比最小值还要小的数,也就意味着被插入的数要和数组所有元素比较一次。我们需要对直接插入排序进行改进。

怎么改进呢?前面提过,插入排序对已经排好序的数组操作时,效率很高。因此我们可以试着先将数组变为一个相对有序的数组,然后再做插入排序。

希尔排序能实现这个目的。希尔排序把序列按下标的一定增量(步长)分组,对每组分别使用插入排序。随着增量(步长)减少,一直到一,算法结束,整个序列变为有序。因此希尔排序又称缩小增量排序。

一般来说,初次取序列的一半为增量,以后每次减半,直到增量为一。

用 Java 实现的算法如下:

选择排序是一种简单直观的排序算法,首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

1. 简单选择排序

选择排序思想的暴力实现,每一趟从未排序的区间找到一个最小元素,并放到第一位,直到全部区间有序为止。

用 Java 实现的算法如下:

2. 堆排序

我们知道,对于任何一个数组都可以看成一颗完全二叉树。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图:

像上图的大顶堆,映射为数组,就是 [50, 45, 40, 20, 25, 35, 30, 10, 15]。可以发现第一个下标的元素就是最大值,将其与末尾元素交换,则末尾元素就是最大值。所以堆排序的思想可以归纳为以下两步:

  1. 根据初始数组构造堆
  2. 每次交换第一个和最后一个元素,然后将除最后一个元素以外的其他元素重新调整为大顶堆

重复以上两个步骤,直到没有元素可操作,就完成排序了。

我们需要把一个普通数组转换为大顶堆,调整的起始点是最后一个非叶子结点,然后从左至右,从下至上,继续调整其他非叶子结点,直到根结点为止。

归并排序是建立在归并操作上的一种有效,稳定的排序算法。该算法采用分治法的思想,是一个非常典型的应用。归并排序的思路如下:

  1. 将 n 个元素分成两个各含 n/2 个元素的子序列
  2. 借助递归,两个子序列分别继续进行第一步操作,直到不可再分为止
  3. 此时每一层递归都有两个子序列,再将其合并,作为一个有序的子序列返回上一层,再继续合并,全部完成之后得到的就是一个有序的序列

关键在于两个子序列应该如何合并。假设两个子序列各自都是有序的,那么合并步骤就是:

  1. 创建一个用于存放结果的临时数组,其长度是两个子序列合并后的长度
  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置
  3. 比较两个指针所指向的元素,选择相对小的元素放入临时数组,并移动指针到下一位置
  4. 重复步骤 3 直到某一指针达到序列尾
  5. 将另一序列剩下的所有元素直接复制到合并序列尾

用 Java 实现的归并排序如下:

基数排序的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。为此需要将所有待比较的数值统一为同样的数位长度,数位不足的数在高位补零。

使用 Java 实现的基数排序:


最新文章
百度智能云领跑中国“AI+工业互联网”,市场地位与发展能力双维度第一
10月29日,国内权威咨询机构赛迪顾问发布《AI+工业互联网报告简报》显示:百度智能云在2020年中国AI+工业互联网市场竞争格局中位居领导者象限,并在市场地位和发展能力双维度上均列第一。赛迪报告分别从市场地位和发展能力两个维度对中国AI+工
小程序开发一个多少钱?可以更新迭代商城小程序费用参考!
商城类的小程序,整体上费用在1000~9000元不等。商城类小程序,当然也存在9.9元~300元左右报价,甚至在一些社交媒体平台上有人“热心肠”免费帮忙制作、全年免费帮忙维护和搭建,背后实则暗藏欺诈和套路。在2024年制作一个小程序,开源节流
主营产品:VOCs在线监测、环境在线监测系统、TSP在线检测仪、VOCs超标报警仪
  成都环境在线监测系统PM2.5臭氧浓度实时检测根据国家环境部门发布的《环境信息zui网络建设规范》(HJ460-2009)、《环境保护应用软件开发管理技术规范》(HJ622-2011)、《污染源在线自动监控监测系统数据传输标准2122005》、《环境污
百度蜘蛛池租用:最新百度蜘蛛池收录策略解析,提升网站流量与排名的秘诀
百度蜘蛛池租用解析:掌握最新收录策略,优化网站流量与排名。本内容深度剖析蜘蛛池租用技巧,助您高效提升网站在百度搜索中的表现。本文目录导读:了解百度蜘蛛池最新百度蜘蛛池收录策略监测与调整随着互联网的飞速发展,搜索引擎优化(SE
华为MateXs2什么时候上市?华为MateXs2上市时间及价格介绍
华为MateXs2新款折叠屏手机即将上市,那么它的价格是多少呢,上市时间是什么时候呢?现在让小编来给大家详细的介绍一下吧,感兴趣的朋友可以来看看哦,希望能够帮助到大家!华为matexs2这款手机的最低价格将会在16999元起售,符合华为一贯
首先文献管理我给大家推荐三个软件,也是我自己一直在用的,尤其是Zotero和小绿鲸真的用起来超级方便。
大家好!我是le。前面我发了推文研究生最常用的工具推荐,受到了大家的好评,研究生最常用的科研工具推荐,但是也有好多同学留言说是不是很齐全,所以本期我推出最全版本。包含了在科研过程中可能用到的各种工具,希望对大家的学术研究工作
t3特惠车主 2.15.0 更新:2024-12-12备案号:苏ICP备19021948号-3A
t3特惠车主,一般又称T3车主app,t3特选车主app。T3出行是一汽、东风、长安三大国企联合腾讯、阿里等多方知名企业联合投资打造的智慧出行生态平台。我们以“成为值得信赖的出行服务企业”为愿景,以“科技引领 愉快出行”为使命,为网约车司
值得一试的8个最佳AI写代码工具
生成式人工智能为许多新的创新和AI工具打开了闸门。从人工智能图像生成到人工智能编码助手,有太多的东西需要解读,而且我们每天都在学习新的应用。在本文中,我们将专门讨论可以帮助您进行软件开发的人工智能编码工具。您可以使用下面列出
用AI绘画生成超逼真美女写真,跟我一起体验科技之美!
限时免费,点击体验最近超火的AI生图神器,坐拥3000美女的大男主就是你! https://ai.sohu.com/pc/generate/textToImg?_trans_=030001_yljdaimn 是否曾幻想过,只需轻轻一点,就能得到一张美丽的女友写真?今天,家人们,我要和大家聊聊如
销售心理学读后感
销售心理学读后感(通用10篇)  细细品味一本名著后,相信大家都有很多值得分享的东西,是时候写一篇读后感好好记录一下了。那么你真的会写读后感吗?以下是小编精心整理的销售心理学读后感,欢迎大家借鉴与参考,希望对大家有所帮助。 
相关文章
推荐文章
发表评论
0评