排序算法(1)

排序算法(1)

先赞后看,养成习惯!!! ^ _ ^ ❤️ ❤️ ❤️
码字不易,大家的支持就是我坚持下去的动力,点赞后不要忘记关注我哦

个人主页:伯明翰java
文章专栏:数据结构和算法
如有错误,请您指正批评 ^ _ ^

什么是排序

排序:所谓排序,就是使⼀串记录,按照其中的某个或某些关键字的⼤⼩,递增或递减的排列起来的
操作
稳定性:如果待排序的一组数据中,有多个相同的数据,经过排序后如果这些相同数据的相对次序不变就是稳定排序,如果相对次序发生变化就是不稳定排序
注:如果这个排序算法是稳定的,它可以变成不稳定排序,如果是不稳定排序,它变不成稳定排序

常见的排序算法

在这里插入图片描述

常见排序算法实现

插入排序

直接插⼊排序是⼀种简单的插⼊排序法,其基本思想是:把待排序的记录按其关键码值的⼤⼩逐个插⼊到⼀个已经排好序的有序序列中,直到所有的记录插⼊完为⽌,得到⼀个新的有序序列。
当插⼊第i(i>=1)个元素时,前⾯的array[0],array[1],R,array[i-1]已经排好序,此时⽤array[i]的排序码
与array[i-1],array[i-2],R的排序码顺序进⾏⽐较,找到插⼊位置即将array[i]插⼊,原来位置上的元素
顺序后移

/** * 直接插入排序 * 时间复杂度O(n^2) * 稳定排序 * 空间复杂度O(1) * @param arr */publicstaticvoidinsetSort(int[] arr){int j;for(int i=1;i<arr.length;i++){int temp = arr[i];for(j=i-1;j>=0&&arr[j]>temp;j--){ arr[j+1]=arr[j];} arr[j+1]=temp;}}

特点

  1. 元素集合越接近有序,直接插⼊排序算法的时间效率越⾼
  2. 时间复杂度:O(N^2
  3. 空间复杂度:O(1),它是⼀种稳定的排序算法
  4. 稳定性:稳定

希尔排序

希尔排序法⼜称缩⼩增量法。希尔排序法的基本思想是:先选定⼀个整数,把待排序⽂件中所有记录
分成多个组,所有距离为的记录分在同⼀组内,并对每⼀组内的记录进⾏排序。然后,取,重复上述
分组和排序的⼯作。当到达=1时,所有记录在统⼀组内排好序。

在这里插入图片描述
/** * 希尔排序 * 时间复杂度O(n^3/2) * 稳定排序 * 空间复杂度O(1) * @param array */publicstaticvoidshellSort(int[] array){int d=array.length;while(d>1){ d=d/2;for(int i=d;i<array.length;i++){int temp = array[i];int j=i-d;while(j>=0&&array[j]>temp){ array[j+d]=array[j]; j-=d; array[j+d]=temp;}}}}

特点

  1. 希尔排序是对直接插⼊排序的优化
  2. 当gap > 1时都是预排序,⽬的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这
    样就会很快。这样整体⽽⾔,可以达到优化的效果。我们实现后可以进⾏性能测试的对⽐。

选择排序

每⼀次从待排序的数据元素中选出最⼩(或最⼤)的⼀个元素,存放在序列的起始位置,直到全部待
排序的数据元素排完 。

直接选择排序

在元素集合array[i]–array[n-1]中选择关键码最⼤(⼩)的数据元素
• 若它不是这组元素中的最后⼀个(第⼀个)元素,则将它与这组元素中的最后⼀个(第⼀个)元素交

• 在剩余的array[i]–array[n-2](array[i+1]–array[n-1])集合中,重复上述步骤,直到集合剩余1个
元素

/**x * 选择排序 * 时间复杂度O(n^2) * 不稳定排序 * 空间复杂度O(1) * @param array */publicstaticvoidselectSort(int[] array){for(int i=0;i<array.length;i++){int mindex=i;for(int j=i+1;j<array.length;j++){if(array[j]<array[mindex]){ mindex=j;}}swep(array,i,mindex);}}privatestaticvoidswep(int[] array ,int i,int j){int temp=array[i]; array[i]=array[j]; array[j]=temp;}

特点

  1. 直接选择排序思考⾮常好理解,但是效率不是很好。实际中很少使⽤
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

堆排序

堆排序(Heapsort)是指利⽤堆积树(堆)这种数据结构所设计的⼀种排序算法,它是选择排序的⼀
种。它是通过堆来进⾏选择数据。需要注意的是排升序要建⼤堆,排降序建⼩堆。

/** * 时间复杂度O(nlogn) * 堆排序 *空间复杂度O(1) * 不稳定排序 * @param array */publicstaticvoidheapSort(int[] array ){creatHeap(array);int end=array.length-1;while(end>0){swep(array,0,end);siftDown(array,0,end); end--;}}privatestaticvoidcreatHeap(int[] array){for(int parent=(array.length-1-1)/2;parent>=0;parent--){siftDown(array,parent,array.length);}}/** * * @param array * @param parent 每颗子树的根节点 * @param length 每颗子树调整结束节点 */privatestaticvoidsiftDown(int[] array,int parent,int length){int child=parent*2+1;while(child<length){if(child+1<length && array[child]<array[child+1]){ child++;}if(array[child]>array[parent]){swep(array,parent,child); parent=child; child=parent*2+1;}else{break;}}}

特点:

  1. 堆排序使⽤堆来选数,效率就⾼了很多
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

Read more

安利一款超实用的前端可视化打印设计器:Vue Print Designer

安利一款超实用的前端可视化打印设计器:Vue Print Designer

做前端开发的朋友应该都懂,业务开发中遇到打印需求真的头大 —— 手写分页逻辑繁琐、不同框架适配麻烦、票据 / 快递单这类定制化打印场景不好实现,找个趁手的打印插件更是难上加难。最近发现了一款开源的可视化打印设计器Vue Print Designer,完美解决了这些痛点,不管是快速开发还是企业级定制化需求都能满足,今天就跟大家详细聊聊这款工具。 一、Vue Print Designer 是什么? Vue Print Designer 是一款面向业务表单、标签、票据、快递单等打印场景的可视化设计器,核心主打模板化、变量化设计,还提供了静默打印、云打印能力,同时支持 PDF / 图片 / Blob 等多种导出方式,完全能覆盖日常开发中的各类打印需求。 它不是简单的打印插件,而是一套完整的打印解决方案,从可视化设计模板,到参数配置、多端打印,再到定制化扩展,一站式搞定,而且项目还在持续更新,最新版本已经支持英寸、厘米作为单位,对国际化和精细化设计更友好了。 项目地址:https://gitee.com/

By Ne0inhk
Flutter for OpenHarmony: Flutter 三方库 jaspr 为鸿蒙端开启极速渲染的现代 Web 开发新范式(Dart Web 框架首选)

Flutter for OpenHarmony: Flutter 三方库 jaspr 为鸿蒙端开启极速渲染的现代 Web 开发新范式(Dart Web 框架首选)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 开发时,我们偶尔需要跳出原生的 HAP 容器,寻找更轻量、更适合在移动端 Web 加载的方案。虽然 Flutter Web 极其强大,但其生成的 Canvas/Wasm 产物体积巨大,在鸿蒙系统加载较慢。是否存在一种方案,既能使用 Dart 的声明式开发体验,又能产出纯正、轻量的 HTML/CSS/JS 节点? jaspr 就是这个问题的终极答案。它是一个模仿 Flutter 语法、但专注于渲染原生 Web DOM 的现代框架。通过 Jaspr,鸿蒙开发者可以利用熟悉的 Widget、Component 和生命周期,

By Ne0inhk
Flutter for OpenHarmony: Flutter 三方库 sanitize_html 彻底杜绝 XSS 注入风险(鸿蒙 Web 内容安全净化)

Flutter for OpenHarmony: Flutter 三方库 sanitize_html 彻底杜绝 XSS 注入风险(鸿蒙 Web 内容安全净化)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在开发 OpenHarmony 应用时,如果我们需要在 UI 中渲染来自后端的 HTML 内容(例如文章正文、用户评论),或者使用 flutter_html 等库,一个致命的安全风险就是 XSS (跨站脚本攻击)。恶意代码可能会通过 <script> 标签或 onerror 属性在你的 App 内执行非法逻辑。 sanitize_html 是一个轻量级且极高效的 HTML 净化库。它采用白名单机制,能瞬间过滤掉所有不安全的标签和属性,确保你在鸿蒙 App 内渲染的每一行 Web 内容都是绝对安全的。 一、核心防御机制解析 sanitize_html 遵循“默认拒绝”

By Ne0inhk
【前端】win11操作系统安装完最新版本的NodeJs运行npm install报错,提示在此系统上禁止运行脚本

【前端】win11操作系统安装完最新版本的NodeJs运行npm install报错,提示在此系统上禁止运行脚本

🌹欢迎来到《小5讲堂》🌹 🌹这是《前端》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!🌹 目录 * 前言 * 解决方案 * 方法1:以管理员身份运行 PowerShell 并更改执行策略 * 方法2:只为当前会话临时允许 * 方法3:使用命令提示符 (CMD) * 方法4:绕过策略执行单个脚本 * 推荐解决方案 * Node.js 详细介绍 * 什么是 Node.js? * 核心特点 * 1. **非阻塞 I/O 和事件驱动** * 2. **单线程但高并发** * 架构组成 * 1. **V8 JavaScript 引擎** * 2. **LibUV 库** * 3. **核心模块** * 安装与使用

By Ne0inhk