当前位置: 首页 > news >正文

手撕八大排序(上)

排序的概念及其引用:

排序的概念:

排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的;

画图说明:

排序前A在B前面,排序后说明该排序稳定,如果排序后B在A前面则说明不稳定。

内部排序:数据元素全部放在内存中的排序。
外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

八大排序我们一般将其分为五类,分别为:

一:  插入排序

1. 直接插入排序

2. 希尔排序

二: 选择排序

1.直接选择排序

2.堆排序

三: 交换排序

1. 冒泡排序

2. 快速排序

四: 归并排序

五:基数排序

插入排序:

直接插入排序:

基本思路:

思路:从第二个数开始,假设此数为 tmp ,逐个往前进行比对,如果前数大于 tmp ,就将前数值赋值到 tmp 处,然后继续往前比对,直到找到小于或等于 tmp 的数(或者比对至数据首)就停止,最后将 tmp 的值赋值到此处就行了

动图演示:

代码:

 public void insertSort(int[] array) {if (array.length == 0) {return;}for (int i = 1; i < array.length; i++) {int temp = array[i];int j = i - 1;for ( ; j >= 0 ; j--) {if (array[j] > temp) {array[j + 1] = array[j];} else {break;}}array[j + 1] = temp;}}

 直接插入排序总结:

1. 集合元素越接近有序,时间效率越高

2. 时间复杂度: O(N^2)

3. 空间复杂度: O(1)

4. 稳定性: 稳定 

希尔排序:

前言:

既然同为插入排序,那必然是有共同点的。

希尔排序是建立在直接插入排序基础上,经过优化的插入排序。

希尔排序分为两步:

  • 1、预排序,使得数据尽可能接近有序
  • 2、直接插入排序,最后调用一次直接插入排序,快速的完成排序

基本思路:

思路:预排序是通过区间划分实现的,假设当前区间为 gap,那么 1、1+gap*n 可以分成一组,同理2、3、4 都可以分,将这些组分别进行直接插入排序(数据少,效率高)。每完成一次分组排序,gap 就会缩小,直到 gap 为1时,进行一次直接插入排序,整个希尔排序就完成了

代码如下:

public static void shellSort(int[] array) {int gap = array.length;while (gap > 1) {shell(array,gap);gap /= 2;}//整体进行插入排序shell(array,1);}public static void shell(int[] array,int gap) {for (int i = 1; i < array.length; i++) {int temp = array[i];int j = i - gap;for ( ; j >= 0 ; j-= gap) {if (array[j] > temp) {array[j + gap] = array[j];} else {break;}}array[j + gap] = temp;}}

动图演示:

预排序:

希尔排序(预排序)

 直接插入排序:

直接插入排序

希尔排序总结:

1. 希尔排序的时间复杂度要用到高数中的知识,“根据大量的数据的得到了局部的结论...”,我们直接记答案即可:O(N^1.25)

2. 空间复杂度: O(1);

我们仅仅只创建了一个gap

3. 稳定性: 不稳定;

我们在排序过程中gap会有多次的改变,不同的组别中可能会发生交换现象。

选择排序:

直接选择排序:

基本思想:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完

代码:

//选择排序public static void selectSort(int[] array) {for (int i = 0; i < array.length; i++) {int minIndex = i;for (int j = i + 1; j < array.length; j++) {if(array[j] < array[minIndex]) {minIndex = j;}}int temp = array[i];array[i] = array[minIndex];array[minIndex] = temp;}}

如果像这样去遍历的话,时间复杂度为O(N^2)不算是个很优解我们可以考虑对此进行优化

优化:每次遍历选最大与最小,分别与 end 值和 begin 值交换

动图演示:

简单选择排序

 直接选择排序总结:

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

堆排序:

我们之前也介绍过堆排序,PriorityQueue本质就是个小根堆,这里就不过多介绍了。

思路:堆排序用到了堆的知识,如果想排升序的话建大堆,因为大堆中堆顶是最大值,将堆顶值与堆低值交换后,执行向下调整,使其再次变为大堆,就这样反复交换、调整,堆排序就完成了。

 /***  堆排序* @param array 目标数组*/public static void heapSort(int[] array) {createBigHeap(array);int end = array.length - 1;while (end > 0) {swap(array,0,end);shiftDown(array,0, end);end--;}}public static void createBigHeap(int[] array) {//父下标 从倒数第二层开始int parent = (array.length - 1 -1) / 2;for (; parent > 0 ; parent-- ) {shiftDown(array,parent, array.length);}}public static void shiftDown(int[] array,int parent,int len) {int child = 2*parent + 1;while (child < len) {if (child + 1 < len && array[child] < array[child + 1]) {child++;}if (array[child] > array[parent]) {swap(array, parent, child);parent = child;child = 2 * parent + 1;} else {break;}}}private static void swap(int[] array,int i,int j) {int tmp = array[i];array[i] = array[j];array[j] = tmp;}

向上调整动图演示:

向上调整

 堆排序总结:

1. 堆排序使用堆来选数相对于直接插入排序,效率就高了很多。
2. 时间复杂度:O(N*logN)
3. 空间复杂度:O(1)
4. 稳定性:不稳定

本文只是排序的上半部分,涉及的排序思想都还算简单,下一篇文章中将会介绍排序大哥:快速排序,知识点很难敬请期待吧。

相关文章:

手撕八大排序(上)

排序的概念及其引用&#xff1a; 排序的概念&#xff1a; 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有…...

clickhouse 怎么统计每天0点到10点的某个字段的数据量

比喻&#xff1a;统计最近一周0点到10点期间每天id的数量 日期&#xff1a;2023-03-23 09:02:22 日期全是这种格式 第一步先把日期转小时&#xff1a;先把小于10小时的查出来 toHour(card_time)<10 select toDate(t.dates) as dates,sum(t.count) as count from ( se…...

[qiankun]-图片加载问题

[qiankun]-图片加载问题开发版本图片加载报错现象描述分析解决方案base64的展示格式静态资源的展示方式取消hash的取值方式&#xff0c;并在主应用中添加图片设置图片的绝对路径根据环境动态设置图片的绝对路径nginx转发方式开发版本 "vue": "^3.2.45", &…...

关于upstream的八种回调方法

1 creat_request调用背景&#xff1a;用于创建自己模板与第三方服务器的第一次连接步骤1&#xff09; 在Nginx主循环&#xff08;ngx_worker_process_cycle方法&#xff09; 中&#xff0c;会定期地调用事件模块&#xff0c; 以检查是否有网络事件发生。2&#xff09; 事件模块…...

0303泰勒公式-微分中值定理与导数的应用

文章目录1 引入2 泰勒中值定理2.1 泰勒多项式3.2 泰勒中值定理13.3 泰勒中值定理22.4 误差估计4 麦克劳林公式5 常见麦克劳林公式6 泰勒公式相关例题6.1 将函数展成指定的泰勒公式6.1.1 公式法6.1.2 间接展法&#xff08;变量替换&#xff09;6.2 利用泰勒公式求极限6.3 确定无…...

日常运维基础命令

commandexplainps -f -u user_name显示指定用户的进程ps aux --sort-pcpu,pmem先以cpu使用量进行排序&#xff0c;cpu使 用一样&#xff0c;以内存使用率排序ps -ef --forest显示ACLII进程数ps --ppid 28208显示父进程的子进程ps -p 14447 -L显示进程的线程ps -e -o pid&#x…...

人员行为识别系统 TensorFlow

人员行为识别系统人员行为识别系统通过TensorFlow深度学习技术&#xff0c;人员行为识别算法对画面中区域人员不按要求穿戴、违规抽烟打电话、睡岗离岗以及作业流程不规范实时分析预警&#xff0c;发现违规行为立即抓拍告警。深度学习应用到实际问题中&#xff0c;一个非常棘手…...

ES-倒排索引BKD原理skiplist

1.Elasticsearch数据存储结构FST、skiplist、BKD-tree、LSM-tree Elasticsearch数据结构存储流程_善思的博客-CSDN博客_elasticsearch 数据结构 number?keyword?傻傻分不清楚 - Elastic 中文社区 ElasticSearch实战&#xff08;六&#xff09;-Skip List 跳表算法&#xf…...

每天一道大厂SQL题【Day12】微众银行真题实战(二)

每天一道大厂SQL题【Day12】微众银行真题实战(二) 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&…...

带您了解TiDB MySQL数据库中关于日期、时间的坑

带您了解TiDB & MySQL数据库中关于日期、时间的坑时间的基础知识什么是时间计算时间的几种方法世界时&#xff08;UT&#xff09;协调世界时&#xff08;UTC&#xff09;国际原子时&#xff08;TAI&#xff09;时区的概念中国所在的时区操作系统的时区datetimedatectl数据库…...

【华为OD机试模拟题】用 C++ 实现 - 求字符串中所有整数的最小和

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…...

harbor 仓库迁移升级

harbor 仓库迁移升级 harbor仓库安装数据传输仓库切换版本 v1.8.0 v2.3.5 harbor仓库安装 环境准备&#xff1a;安装docker详见&#xff1a;docker 的介绍和部署&#xff0c;并下载docker-compose详见&#xff1a;docker 三剑客compose。 现有支持的安装harbor仓库的方式有两…...

评论功能设计思路~

文章目录 评论功能设计框架1、定义2、目标3、动机4、评论类别**5、评论互动****6、评论区展示结构****6.1 主题式****6.2 平铺式****6.3 盖楼式****7、评论排序机制****8、评论加载形式****9、其他**结语评论功能设计框架 1、定义 评论是指针对于事物进行主观或客观的自我印象…...

算法训练营 day52 动态规划 买卖股票的最佳时机系列1

算法训练营 day52 动态规划 买卖股票的最佳时机系列1 买卖股票的最佳时机 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票…...

3.基于分割的文本检测算法--DBNet++

文章目录1.概况2.DBNet中的主要方法2.1 网络结构2.2 适应特征图融合模块(Adaptive Scale Fusion Module, ASF)3.ASF模块的源码实现参考资料欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; 1.概况 2022年02月份论文&#xff1a;Real-Time S…...

IOS打包、SDK接入记录等

IOS打包、SDK接入记录等 Mac上安装HCLR路径 /Applications/Unity/Hub/Editor/2019.4.40f1c1/Unity.app/Contents/il2cpp HCLR 指定4.40是要Unity启动打开的il2cpp&#xff0c;否则HCLR Installer他会报找不到MonoBleedingEdge Mac删除证书 只能点击钥匙串做上角的登录后&…...

【C++】类与对象(引入)

目录 前言 类的引入 类的定义 封装与访问限定符 封装 访问限定符 类的实例化 类的大小 this指针 特性 前言 &#x1f3b6;我们都知道&#xff0c;C语言是面向过程的编程&#xff0c;而C是面向对象的编程&#xff0c;更多体现在编程的关注点上。 &#x1f3b6;就拿洗…...

Redis 高级数据类型

文章目录一、Bitmaps&#xff1a;属性状态统计二、HyperLogLog&#xff1a;基数统计三、GEO&#xff1a;地理位置信息计算提示&#xff1a;以下是本篇文章正文内容&#xff0c;Redis系列学习将会持续更新 一、Bitmaps&#xff1a;属性状态统计 Bitmaps类型&#xff1a; 统计一…...

Java8 新特性-函数式接口

什么是函数式接口 先来看看传统的创建线程是怎么写的 Thread t1 new Thread(new Runnable() {Overridepublic void run() {System.out.println("t1");} }); t1.start();再来看看使用了函数式接口是怎么写的 Thread t2 new Thread(() -> System.out.println(&…...

这套软件测试试卷能打90分,直接入职字节吧

目录 一&#xff0e;填空 二、 判断题&#xff08;正确的√&#xff0c;错误的╳&#xff09;共10分&#xff0c;每小题1分 三、数据库部分&#xff1a;&#xff08;共15分&#xff09; 四、设计题。本题共 1 小题&#xff0c;满分 20分 一&#xff0e;填空 1、 系…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...