详解排序几大算法

一、插入排序

基本思想:

  • 直接插入排序是一种简单的插入排序算法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。

步骤:

当插入第n个元素的时候前面的arr[0]到arr[n-1]都已经排序好了,此时我们将arr[n]与前面的相比较,假设我们需要一个升序的数组,那当arr[n]小于所比较的这个数的时候,就跟其交换位置,原来位置上的元素顺序后移。

动图演示:
在这里插入图片描述
代码实现:

void InsertSort(int* a, int n)
{for (int i = 0; i < n-1; i++){//记录最后一个元素的下标int end = i ;//待排序的数据int tmp = a[end + 1];while (end >= 0){//比插入的数大就往后if (a[end] > tmp){a[end + 1] = a[end];end--;}//比插入的数小就跳出循环else{break;}}a[end + 1] = tmp;}
}

直接插入排序的特性:

  • 元素集合越接近有序,直接插入排序算法的时间效率就越高
  • 时间复杂度:O(N^2)
  • 空间复杂度:O(1)

二、希尔排序

基本思想:

  • 先选定一个整数(通常是gap = n/3+1),把待排序文件所有记录成各组,所有的距离相等的记录在同一组内,并对每一组内的记录进行排序,然后gap = gap/3+1得到下一个整数,再将数组分成各组,进行插入排序,当gap = 1时,将相当于直接插入排序。
  • 所有我们会发现希尔排序是直接插入算法的基础上进行改进而来,但是它的效率要高于直接插入排序。
    在这里插入图片描述

动图演示:
在这里插入图片描述

希尔排序的特性:

  • 希尔排序是对直接排序的优化
  • 当gap > 1时都时预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了。

代码实现:

void ShellSort(int* a, int n)
{int gap = n;while (gap>1){gap = gap / 3 + 1;//单趟排序for (int i = 0; i < n - gap; i++){int end = i;int tmp = a[end + gap];while (end >= 0){if (a[end] > tmp){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}

希尔排序的时间复杂度:O(n^3/2)
希尔排序的空间复杂度:O(1)

三、选择排序

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

直接选择排序步骤:

  1. 在元素集合 array[i]–array[n-1] 中选择关键码最⼤(小)的数据元素
  2. 若它不是这组元素中的最后⼀个(第⼀个)元素,则将它与这组元素中的最后⼀个(第⼀个)元素交换
  3. 在剩余的 array[i]–array[n-2](array[i+1]–array[n-1]) 集合中,重复上述步骤,直到集合剩余 1 个元素

动图演示:
在这里插入图片描述
代码实现:

void SelectSort(int* a, int n)
{int begin = 0, end = n - 1;while (begin < end){int mini = begin, maxi = begin;for (int i = begin; i <= end; i++){if (a[i] > a[maxi]){maxi = i;}if (a[i] < a[mini]){mini = i;}}if (begin == maxi){maxi = mini;}swap(&a[mini], &a[begin]);swap(&a[maxi], &a[end]);++begin;--end;}
}

直接选择排序的时间复杂度:O(N^2)
直接选择排序的空间复杂度:O(1)

四、堆排序

堆排序是指利用堆积树这种数据结构所设计的一种排序算法,它是选择排序的一种。
我们需要注意的是排升序要建大堆,排降序建小堆。
点这里在二叉树里面实现了堆排序

五、冒泡排序

动图演示:
在这里插入图片描述
代码实现:

//冒泡排序
void BubbleSort(int* arr, int n)
{int end = n;while (end){int flag = 0;for (int i = 1; i < end; ++i){if (arr[i - 1] > arr[i]){int tmp = arr[i];arr[i] = arr[i - 1];arr[i - 1] = tmp;flag = 1;}}if (flag == 0){break;}--end;}
}

冒泡排序的时间复杂度:O(N^2)
冒泡排序的空间复杂度:O(1)

六、快速排序

基本思想:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。

hoare版本

算法思想:
1.创建左右指针,确定基准值
2.从右向左找出比基准值小的数据,从左往右找出比基准值大的数据,左右指针数据交换,进入下一次循环

步骤:

我们选定一个key(一般是最右边的数,或者最左边的数)接着我们需要定义一个begin和一个end,begin是从左往右走,end是右往左走。在它们走的过程中,当begin遇到比key大的数据的时候停下来,end继续走,指导遇到一个小于key的数时,两者交换数据,最后直到它们相遇,相遇点的数据和key的数据交换。

动图演示:
在这里插入图片描述

void QuickSort(int* a, int begin, int end)
{if (begin >= end)return;int left = begin;int right = end;//选左边为keyint keyi = begin;while (begin < end){while (a[end] >= a[keyi] && begin < end){--end;}//左边选大while (a[begin] <= a[keyi] && begin < end){++begin;}//小的换到右边,大的换到左边swap(&a[begin], &a[end]);}swap(&a[keyi], &a[end]);keyi = end;QuickSort(a, left, keyi - 1);QuickSort(a,keyi + 1,right);
}

挖坑法

基本思路:
创建左右指针,首先从右往左找出比基准值小的数据,后将其放在左边坑中,当前的位置就变为新的坑,然后在从左往右找出比基准值大的数据,找到后将其放进右边坑中,当前位置变为新的坑,当结束循环的时候将最开始储存的分界值放进当前的坑中,返回当前坑的下标。

步骤:

选出一个数据(可以是最左也可以是最右,一般情况下)存放在key变量中,在这个数据位置形成一个坑,紧接着我们定义一个Left和一个Right,Left从左往右走,Right从右往左走。
需要注意的是如果最左边挖坑,则需要Right先走;反之,则Left先走。

动图演示:
在这里插入图片描述
代码实现:

void QuickSort1(int* a, int begin, int end)
{if (begin >= end){return;}int left = begin,right = end;int key = a[begin];while (begin < end){//找小while (a[end] >= key && begin < end){--end;}//小的放到左边的坑里a[begin] = a[end];//找大while (a[begin] <= key && begin < end){++begin;}//大的放到右边的坑里a[end] = a[begin];}a[begin] = key;int keyi = begin;QuickSort1(a, left, keyi - 1);QuickSort1(a, keyi + 1, right);
}

lomuto前后指针

基本思路:
创建前后指针从左往右找比基准值小的进行交换,使得小的都排在基准值的左边。

步骤:

选出一个key,起始时prev指针指向序列开头,cur指针指向prev+1的位置。若cur指向的数据小于key,则prev先向后移动一位,然后将prev和cur指针指向的数据交换,cur++;若cur指向的数据大于key,则cur指向直接++。如此进行下去,直到cur到达end位置,此时将key和++prev指针指向的数据交换即可。

在这里插入图片描述
代码实现:

void QuickSort2(int* arr, int begin, int end)
{if (begin >= end){return;}int cur = begin, prev = begin - 1;int keyi = end;while (cur != keyi){if (arr[cur] < arr[keyi] && ++prev != cur){swap(&arr[cur], &arr[prev]);}++cur;}swap(&arr[++prev],&arr[keyi]);keyi = prev;QuickSort2(arr, begin, keyi - 1);QuickSort2(arr, keyi + 1, end);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/64303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 垃圾回收机制详解

1 垃圾回收的概念 垃圾回收&#xff08;Garbage Collection&#xff0c;GC&#xff09;是自动管理内存的一种机制&#xff0c;用于释放不再使用的对象所占用的内存空间&#xff0c;防止内存溢出。垃圾回收器通过识别和回收那些已经死亡或长时间未使用的对象&#xff0c;来优化…

车载终端_智能车载终端定制_农机/出租车/叉车/驾培车载终端MTK方案

车载终端集成了先进的技术和卓越的性能&#xff0c;采用了联发科的高效低功耗ARM处理器&#xff0c;具备八核架构&#xff0c;主频高达2.0GHz&#xff0c;基于12nm制程工艺&#xff0c;不仅性能强劲&#xff0c;而且功耗控制出色。基本配置为4GB内存与64GB存储&#xff0c;用户…

【JavaSE基础】第十七章:反射+设计模式

一、反射 1.反射(Reflection)&#xff1a;允许在程序运行状态中&#xff0c;可以获取任意类中的属性和方法&#xff0c;并且可以操作任意对象内部的属性和方法&#xff0c;这种动态获取类的信息及动态操作对象的属性和方法对应的机制称为反射机制。 2.类对象 和 类的对象(实例…

Scratch教学作品 | 3D圆柱体俄罗斯方块——旋转视角的全新挑战! ✨

今天为大家推荐一款创意十足的Scratch益智游戏——《3D圆柱体俄罗斯方块》&#xff01;由Ceratophrys制作&#xff0c;这款作品将经典俄罗斯方块与立体圆柱舞台相结合&#xff0c;为玩家带来了前所未有的空间挑战与乐趣。更棒的是&#xff0c;这款游戏的源码可以在小虎鲸Scratc…

三维空间刚体运动4-1:四元数表示变换(各形式相互转换加代码——下篇)

三维空间刚体运动4-1&#xff1a;四元数表示变换&#xff08;各形式相互转换加代码——下篇&#xff09; 4. 四元数到其它旋转表示的相互转换4.1 旋转向量4.2 旋转矩阵4.3 欧拉角4.3.1 转换关系4.3.2 转换中的万象锁问题 5. 四元数的其他性质5.1 旋转的复合5.2 双倍覆盖5.3 指数…

使用layui的table提示Could not parse as expression(踩坑记录)

踩坑记录 报错图如下 原因&#xff1a; 原来代码是下图这样 上下俩中括号都是连在一起的&#xff0c;可能导致解析问题 改成如下图这样 重新启动项目&#xff0c;运行正常&#xff01;

大模型的构建与部署(2)——数据清洗

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. 数据清洗的必要性与影响 1.1 数据清洗对模型性能的影响 数据清洗是数据预处理的关键步骤,对于模型训练的性能和准确性有着直接的影响。原始数据中的缺失值、重复值、异常值以及数据格式不一致…

【MySQL】--- 数据库基础

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; MySQL 本篇博客我们来建立一下数据库的相关概念&#xff0c;主要理解什么是数据库以及mysql和mysqld&#xff0c;MySQL架构等问题。 &#x1f3e0; 登录…

Vue中纯前端实现导出简单Excel表格的功能

Vue 前端Excel导出 Vue中纯前端导出简单Excel表格的方法(使用vue-json-excel插件) 前言 在许多的后台系统中少不了导出Excel表格的功能&#xff0c;在项目中纯前端使用vue-json-excel插件来实现简单Excel表格的导出功能。 使用方法 1、安装依赖 npm install vue-json-exc…

KeyFormer:使用注意力分数压缩KV缓存

Keyformer: KV Cache Reduction through Key Tokens Selection for Efficient Generative Inference 202403&#xff0c;发表在Mlsys Introduction 优化KV cache的策略&#xff0c;主要是集中在系统级别的优化上&#xff0c;比如FlashAttention、PagedAttention&#xff0c;它…

Linux 权限管理实践:精确控制用户对 systemctl 和 journalctl 命令的使用

前言 在 Linux 系统管理中&#xff0c;精确控制用户对特定命令的访问权限是一项关键的安全实践。使用 systemctl 和 journalctl 命令时&#xff0c;不当的权限设置可能会导致不必要的风险。本篇博客将详细讨论如何通过 sudoers 文件和 Polkit 策略为不同用户配置 systemctl 和…

SSH连接成功,但VSCode连接不成功

环境 在实验室PC上连接服务器234 解决方案&#xff1a;在VSCode中重新添加远程主机 删除旧的VSCode Server 在远程主机上&#xff0c;VSCode会安装一个‘vscode-server’服务来支持远程开发&#xff0c;有时旧的‘vscode-server’文件可能会导致问题&#xff0c;删除旧的&am…

【Qt】qt安装

在工作一年之后&#xff0c;还是想做一个Qt的教程&#xff0c;遥想研一刚刚接触Qt&#xff0c;从0到1学习&#xff0c;没有什么参考书籍&#xff0c;网上的资料也不多&#xff0c;幸好Qt官方文档写得好&#xff0c;加上自己肯研究&#xff0c;才堪堪入门。 现在我想自己写一个…

Web开发 -前端部分-CSS

CSS CSS&#xff08;Cascading Style Sheet&#xff09;:层叠样式表&#xff0c;用于控制页面的样式&#xff08;表现&#xff09;。 一 基础知识 1 标题格式 标题格式一&#xff1a; 行内样式 <!DOCTYPE html> <html lang"en"><head><meta…

YOLOv8目标检测(六)_封装API接口

YOLOv8目标检测(一)_检测流程梳理&#xff1a;YOLOv8目标检测(一)_检测流程梳理_yolo检测流程-CSDN博客 YOLOv8目标检测(二)_准备数据集&#xff1a;YOLOv8目标检测(二)_准备数据集_yolov8 数据集准备-CSDN博客 YOLOv8目标检测(三)_训练模型&#xff1a;YOLOv8目标检测(三)_训…

51c视觉~YOLO~合集6~

我自己的原文哦~ https://blog.51cto.com/whaosoft/12830685 一、其他yolo 1.1 Spiking-YOLO​ 使用常规深度神经网络到脉冲神经网络转换方法应用于脉冲神经网络域时&#xff0c;性能下降的很多&#xff0c;深入分析后提出了可能的解释&#xff1a;一是来自逐层归一化的效率…

如何在 Ubuntu 22.04 上安装 Strapi CMS

简介 Strapi 是一个使用 JavaScript 构建的开源、无头内容管理系统 (CMS)。与其他无头 CMS 一样&#xff0c;Strapi 开箱即用不带前端。它使用 API 作为其前端&#xff0c;允许你使用流行的框架&#xff08;如 React 和 Next.js&#xff09;构建网站。Strapi 基于插件系统&…

数字IC后端零基础入门基础理论(Day1)

数字IC后端设计导入需要用到的input数据如下图所示。 数字后端零基础入门系列 | Innovus零基础LAB学习Day9 Netlist: 设计的Gate level&#xff08;门级&#xff09;网表。下图所示为一个计数器设计综合后的门级netlist。 从这个netlist中我们看到这个设计顶层的名字叫counte…

序列模型的使用示例

序列模型的使用示例 1 RNN原理1.1 序列模型的输入输出1.2 循环神经网络&#xff08;RNN&#xff09;1.3 RNN的公式表示2 数据的尺寸 3 PyTorch中查看RNN的参数4 PyTorch中实现RNN&#xff08;1&#xff09;RNN实例化&#xff08;2&#xff09;forward函数&#xff08;3&#xf…

WSL2内部的Ubuntu怎么设置网络内桥接模式,弄了好久老是不成功,怎么办?

环境: Win10专业版 WSL2 Ubuntu22.04 问题描述: WSL2内部的Ubuntu怎么设置网络内桥接模式 解决方案: 方法一 1.控制面板开启,Hyper-V 管理器 2.重启电脑 3…创建外部虚拟交换机 打开 Hyper-V 管理器,在右侧操作面板中点击“虚拟交换机管理器”。 选择“创建虚…