首页 文章 精选 留言 我的

精选列表

搜索[全场景互联],共10000篇文章
优秀的个人博客,低调大师

Hanami 2.0 发布,全栈 Ruby Web 框架

经过三年多的努力,Hanami 2.0 正式发布,随着这个版本的发布,Hanami 进入了框架成熟的新阶段,并为 Ruby 社区开启了新的篇章。 更好 Hanami 2.0 的核心是现在的 app/ 目录,在这里,你可以随心所欲地组织你的代码,同时还可以享受常见组件的合理默认值。随着你的应用程序的增长,你可以利用切片的优势,将你的代码分成若干域。 Hanami 2.0 提供了一个既简单又强大的框架: 新的应用程序核心提供了以容器和组件为中心的高级代码加载功能 代码自动加载帮助你以最小的代价工作 新的内置切片随着你的应用程序的增长而逐渐提供模块化。 一个始终存在的依赖关系混合器帮助你在你的应用程序的组件之间建立更清晰的联系 重新设计的 action 类与你的应用程序的业务逻辑无缝集成 带有 dotenv 集成的类型安全的应用程序设置,确保你的应用程序在每个环境中都有它所需要的东西。 新的供应商管理你的应用程序的关键组件和集成的生命周期 自上而下的模块化使您能够构建各种类型的应用程序,包括非 Web 应用程序 我们重写的入门指南可以帮助你开始使用上述所有内容 更快 Hanami 2.0 完全重写了 HTTP 路由引擎,基准显示它超过了几乎所有其他引擎。 当在开发中使用 Hanami 时,由于我们的智能代码加载,你的应用程序将立即启动和重新加载。无论你的应用程序有多大,你的控制台将在几毫秒内加载,你的测试将保持快速。 更多详情可查看:https://hanamirb.org/blog/2022/11/22/announcing-hanami-200/

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

常见的初级排序算法,这次全搞懂

本文已被Github仓库收录 https://github.com/silently9527/JavaCore 程序员常用的IDEA插件:https://github.com/silently9527/ToolsetIdeaPlugin 完全开源的淘客项目:https://github.com/silently9527/mall-coupons-server 微信公众号:贝塔学Java 前言 相信所有的程序员刚开始接触到的算法都会是排序算法,因为排序在对数据处理和计算有这重要的地位,排序算法往往是其他算法的基础;本文我们就先从初级排序算法开始学习算法。 排序算法的模板 在开始之前我们先定义一个排序算法通用的模板,在后面的排序算法都会实现这个模板 public interface SortTemplate { void sort(Comparable[] array); default void print(Comparable[] array) { for (Comparable a : array) { System.out.print(a + " "); } } default boolean less(Comparable a, Comparable b) { return a.compareTo(b) < 0; } default void exch(Comparable[] array, int i, int j) { Comparable tmp = array[i]; array[i] = array[j]; array[j] = tmp; } } Comparable: 为了让我们实现的排序算法更加的通用,可以排序任意的对象,所以我们这里使用了Comparable数组 sort: 不同的排序算法实现的方式不一样,子类自己去实现 less: 定义的公用方法,如果a < b就返回true exch: 定义的公用方法,交换数组中的两个对象 print: 打印出数据中的每个元素 选择排序 算法实现的思路: 首先找到数组中的最小元素, 其实将它和数组中的第一个元素进行交换,这样就排定了一个元素; 再次找出剩余元素中最小的元素与数组中的第二个元素进行交换,如此反复直到所有元素都是有序的 代码实现: public class SelectionSort implements SortTemplate { @Override public void sort(Comparable[] array) { int length = array.length; for (int i = 0; i < length; i++) { int min = i; for (int j = i + 1; j < length; j++) { if (less(array[j], array[min])) { min = j; } } exch(array, i, min); } } } 假如输入的数组是有序的,我们会发现选择排序运行的时候和未排序的时间一样长! 对于N个元素的数组,使用选择排序的时间复杂度是O(n²) 选择排序的是数据移动最少的,交换的次数与数组的大小是线性关系,N个元素的数组需要N次交换 冒泡排序 算法实现的思路: 比较相邻的两个元素,如果前一个比后一个大,那么就交换两个元素的位置 对每一组相邻的元素执行同样的操作,直到最后一个元素,操作完成之后就可以排定一个最大的元素 如此往复,直到数组中所有的元素都有序 代码实现: public class BubbleSort implements SortTemplate { @Override public void sort(Comparable[] array) { int length = array.length - 1; for (int i = 0; i < length; i++) { for (int j = 0; j < length - i; j++) { if (less(array[j + 1], array[j])) { exch(array, j, j + 1); } } } } } 对于N个元素的数组,使用冒泡排序的时间复杂度是O(n²) 插入排序 想象我们在玩扑克牌时,整理扑克牌都是把每一张插入到左边已经排好序的牌中适当的位置。插入排序的思路类似 算法实现的思路: 初始默认第一个元素就是有序的,当前索引的位置从0开始 先后移动当前索引的位置,当前索引位置左边的元素是有序的,从后往前开始扫码与当前索引位置元素进行比较 当确定当前索引位置上的元素在左边有序适合的位置之后,插入到该位置上 如果当确定当前索引位置上的元素大于了已排序的最后一个元素,那么当前索引位置直接往后移动 如此反复,直到所有元素有序 代码实现: public class InsertionSort implements SortTemplate { @Override public void sort(Comparable[] array) { int length = array.length; for (int i = 1; i < length; i++) { for (int j = i; j > 0 && less(array[j], array[j - 1]); j--) { exch(array, j, j - 1); } } } } 从代码的实现我们可以看出,当遇到了当前索引的元素大于了左边有序数组的最后一个元素时,内层循环就直接结束了,所以所我们排序的数组中存在着部分有序,那么插入排序算法会很快。 考虑最糟糕的情况,如果输入数组是一个倒置的,那么插入排序的效率和选择排序一样,时间复杂度是O(n²) 希尔排序 对于大规模的乱序数组插入排序很慢,是因为它只交换相邻的元素,元素只能一点一点的从数组中移动到正确的位置;插入排序对于部分有序的数组排序是的效率很高; 希尔排序基于这两个特点对插入排序进行了改进; 算法实现的思路 首先设置一个步长h用来分隔出子数组 用插入排序将h个子数组独立排序 减小h步长继续排序子数组,直到h步长为1 当步长为1时就成了普通的插入排序,这样数组一定是有序的 希尔排序高效的原因,在排序之初,各个子数组都很短,子数组排序之后都是部分有序的,这两种情况都很适合插入排序。 代码实现: public class ShellSort implements SortTemplate { @Override public void sort(Comparable[] array) { int gap = 1; int length = array.length; while (gap < length / 3) { gap = 3 * gap + 1; } while (gap >= 1) { for (int i = gap; i < length; i++) { for (int j = i; j >= gap && less(array[j], array[j - gap]); j -= gap) { exch(array, j, j - gap); } } gap = gap / 3; } } } 最后(点关注,不迷路) 文中或许会存在或多或少的不足、错误之处,有建议或者意见也非常欢迎大家在评论交流。 最后,写作不易,请不要白嫖我哟,希望朋友们可以点赞评论关注三连,因为这些就是我分享的全部动力来源

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

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

用户登录
用户注册