首页 文章 精选 留言 我的

精选列表

搜索[国密算法],共10000篇文章
优秀的个人博客,低调大师

看动画学算法之: 排序 - 快速排序

点击上方的蓝字关注我吧 程序那些事 简介 快速排序也采用的是分而制之的思想。那么快速排序和归并排序的区别在什么地方呢? 归并排序是将所有的元素拆分成一个个排好序的数组,然后将这些数组再进行合并。 而快速排序虽然也是拆分,但是拆分之后的操作是从数组中选出一个中间节点,然后将数组分成两部分。 左边的部分小于中间节点,右边的部分大于中间节点。 然后再分别处理左边的数组合右边的数组。 快速排序的例子 假如我们有一个数组:29,10,14,37,20,25,44,15,怎么对它进行快速排序呢? 先看一个动画: 我们再分析一下快速排序的步骤。 我们选择的是最左边的元素29作为中间点元素,然后将数组分成三部分:[0, 14, 15, 20, 25],[29],[44, 37]。 中间节点29已经排好序了,不需要处理。 接下来我们再对左右分别进行快速排序。最后就得到了一个所有元素都排序的数组。 快速排序的java代码实现 我们先来看最核心的部分partition,如何将数组以中间节点为界,分成左右两部分呢? 我们的最终结果,是要将array分割成为三部分。 首先我们选择最左侧的元素作为中间节点的值。然后遍历数组中的其他元素。 假如m=middleIndex,k=要遍历的元素index 考虑两种情况,第一种情况是数组中的元素比中间节点的值要大。 这种情况下,m不需要移动,k+1继续遍历即可。 第二种情况下,数组中的元素比中间节点的值要小。 因为m左边的元素都要比中间节点的值要小,所以这种情况下m需要+1,即右移一位。 现在m+1位置的元素要么还没有进行比较,要么就是比中间节点的值要大,我们可以巧妙的将m+1位置的元素和k位置的元素互换位置,这样仍然能够保证m左侧的元素要比中间节点的值要小。 将上面的分析总结成java代码如下: private int partition(int[] array, int i, int j) { //选择最左侧的元素作为中心点,middleValue就是中心点的值 int middleValue = array[i]; int middleIndex = i; //从i+1遍历整个数组 for (int k = i+1; k <= j; k++) { //如果数组元素小于middleValue,表示middleIndex需要右移一位 //右移之后,我们需要将小于middleValue的array[k]移动到middleIndex的左边, // 最简单的办法就是交换k和middleIndex的值 if (array[k] < middleValue) { middleIndex++; //交换数组的两个元素 swap(array, k , middleIndex); } //如果数组元素大于等于middleValue,则继续向后遍历,middleIndex值不变 } // 最后将中心点放入middleIndex位置 swap(array, i, middleIndex); return middleIndex; } 最后我们需要将最左侧的元素和中间节点应该在的index的元素互换下位置,这样就将中间节点移动到了中间位置,并返回中间位置。 再来看下divide的代码: public void doQuickSort(int[] array, int low, int high) { //递归的结束条件 if (low < high) { //找出中心节点的值 int middleIndex = partition(array, low, high); //数组分成了三部分: // a[low..high] ~> a[low..m–1], pivot, a[m+1..high] //递归遍历左侧部分 doQuickSort(array, low, middleIndex-1); // a[m] 是中心节点,已经排好序了,不需要继续遍历 //递归遍历右侧部分 doQuickSort(array, middleIndex+1, high); log.info("QuickSort之后的数组:{}",array); } } divide的代码就很简单了,找到中间节点的位置之后,我们再分别遍历数组的左右两边即可。最后得到排好序的数组。 随机快速排序的java实现 上面的例子中,我们的中间节点的选择是数组的最左元素,为了保证排序的效率,我们可以从数组中随机选择一个元素来作为中间节点。 private int partition(int[] array, int i, int j) { //随机选择一个元素作为中心点,middleValue就是中心点的值 int randomIndex=i+new Random().nextInt(j-i); log.info("randomIndex:{}",randomIndex); //首先将randomIndex的值和i互换位置,就可以复用QuickSort的逻辑 swap(array, i , randomIndex); int middleValue = array[i]; int middleIndex = i; //从i遍历整个数组 for (int k = i+1; k <= j; k++) { //如果数组元素小于middleValue,表示middleIndex需要右移一位 //右移之后,我们需要将小于middleValue的array[k]移动到middleIndex的左边, // 最简单的办法就是交换k和middleIndex的值 if (array[k] < middleValue) { middleIndex++; //交换数组的两个元素 swap(array, k , middleIndex); } //如果数组元素大于等于middleValue,则继续向后遍历,middleIndex值不变 } // 最后将中心点放入middleIndex位置 swap(array, i, middleIndex); return middleIndex; } 上面的代码,我们在分区的时候,先选择出一个随机的节点,然后将这个随机的节点和最左侧的元素交换位置,后面的代码就可以重用上面的QuickSort的代码逻辑了。 快速排序的时间复杂度 从上面的分析我们可以看出,每次分区的时间复杂度应该是O(N),而divide又近似二分法,所以总的时间复杂度是O(N logN)。 更多精彩内容 1 一文解开java中字符串编码的小秘密 2 java安全编码指南之:Number操作 3 java安全编码指南之:表达式规则 作者小F,金融科技从业多年,懂技术又懂金融,主攻Java和区块链方向,篇篇都是用心之作,笔耕不辍,持续更新! 微信号 : 程序那些事 ●扫码关注我吧 喜欢本篇文章?帮忙点个「在看」再走吧 本文分享自微信公众号 - 程序那些事(flydean-tech)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

Zstandard 1.4.4 发布,无损数据压缩算法

Zstandard 1.4.4已经发布,这个版本包括一些主要的性能改进和新的 CLI 特性,内容如下: v1.4.3 v1.4.4 silesia.tar 1440 MB/s 1600 MB/s enwik8 1225 MB/s 1390 MB/s calgary.tar 1360 MB/s 1530 MB/s api: 从解析器中提取序列以进行分析的新功能 修复了 ZSTD_initCStream_advanced() 快速模式的性能 cli: 支持管道命名 TAR 扩展支持 --output-dir-flat=DIE新命令将目标文件生成到请求的目录中 --stream-size=#和--size-hint=#新命令 --exclude-compressed新命令 更快 -t 测试模式 改进了一些错误信息 修复字典生成器中的死锁条件 build: 带有 Emscripten 编译脚本的单文件解码器 修复 Visual Studio 上的 zlibWrapper 编译 修复gcc 旧版本的编译 改进了 cmake 脚本的安装目录 pack: 更改了 pkgconfig,以便更好地集成到 OpenWRT 中 详情见发布说明。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册