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

八大排序

目录

选择排序-直接插入排序

插入排序-希尔排序

选择排序-简单选择排序

选择排序-堆排序

交换排序-冒泡排序

交换排序-快速排序

归并排序

基数排序

选择排序-直接插入排序

基本思想:

如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。

具体代码实现:

void InsertSort(int* const arr, const int len)
{assert(arr);for (int i = 0; i < len; i++)//遍历每个元素{for (int j = i; j > 0; j--)//与前面的元素相比较{if (arr[j] < arr[j - 1])swap(arr + j, arr + j - 1);else                    //已经有序break;}}
}

复杂度分析

时间复杂度O(N^2),空间复杂度O(1)

插入排序是一种稳定的排序算法,当元素集合越接近有序,直接插入排序算法的时间效率越高。

插入排序-希尔排序

基本思想:

 对待排序数组中的元素进行分组,从第一个元素开始,按照数组下标中间隔为gap大小的元素分为一组,对每一组进行排序,重新选择gap的大小使得原始数据更加有序,当gap=1的时候就是插入排序。

代码实现:

void ShellSort(int* const arr, const int len)
{int gap = len;while (gap > 1){gap = gap / 3 + 1;//调整gap的大小,gap=1的时候,为插入排序for (int i = gap; i < len; i++)//总共只需要循环len-gap次{for (int j = i; j >= gap; j-=gap)//插入排序{if (arr[j] < arr[j - gap]){swap(arr + j, arr + j - gap);}elsebreak;}}}
}

这里的分组比较不是分开进行的(第一组比完第二组在比),而是多组同时进行比较,从第gap个元素开始,逐渐往前比较,每次和自己和自己gap距离的元素比较

复杂度分析:O(N^1.3 - N^2)

稳定性:不稳定

选择排序-简单选择排序

基本思想:

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

代码实现:

void SelectSort(int*a,int n)
{int left=0;while(left<n){int min=left; for(int i=left;i<n;i++)//找最小值  {if(a[min]>a[i]){min=i;}}Swap(&a[left],&a[min]);//交换数据   然后找次小,交换 left++;	}      
} 

 时间复杂度O(n^2),空间复杂度O(1);不稳定

选择排序-堆排序

基本思想:

堆排序是基于数据结构堆设计的一种排序算法,通过堆来选择数据,向上(向下)调整,得到小数(大数),然后再与堆底数据进行交换,即可排序,需要注意的是排升序建大堆,排降序建小堆

代码实现:

代码实现:

void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
void AdjustDwon(int* a, int n, int root)
{int parent = root;int child = parent * 2 + 1;//找到孩子while (child < n){if (child + 1 < n && a[child + 1] > a[child])//考虑右孩子越界和判断那个孩子大{++child;}if (a[child] > a[parent])//判断孩子和父亲谁大,孩子大,向上交换{Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}
void HeapSort(int* a, int n)
{// 升序  建大堆for (int i = (n - 1 - 1) / 2; i >= 0; --i){AdjustDwon(a, n, i);}int end = n - 1;//向下调整,交换while (end > 0){Swap(&a[0], &a[end]);AdjustDwon(a, end, 0);--end;}
}

时间复杂度O(n*logn),空间复杂度O(1); 不稳定 

交换排序-冒泡排序

基本思想:

代码实现:

//冒泡排序 
void Bubblesort(int *a,int n)
{for(int i=0;i<n;i++)//控制交换次数 {for(int j=0;j<n-i-1;j++)//向后冒泡 ,控制边界 {if(a[j]>a[j+1])//如果前一个值大于后一个值,交换. {swap(&a[j],&a[j+1]);}		}}
} 

 时间复杂度O(n^2),空间复杂度O(1)  稳定

交换排序-快速排序

基本思想:

代码实现:

int PartSort1(int* a, int left, int right)
{int keyi = left;while (left < right){// 找小while (left < right && a[right] >= a[keyi])--right;// 找大while (left < right && a[left] <= a[keyi])++left;swap(&a[left], &a[right]);//交换左右值}swap(&a[keyi], &a[left]);//最后交换key与leftreturn left;//返回当前节点,[0,left-1],[left+1,right]递归排序
}

快排优化:

若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序。为改进之,通常以“三者取中法”来选取基准记录,即将排序区间的两个端点与中点三个记录关键码居中的调整为支点记录,本质在于防止最坏的情况发生(1,已经有序2,数据全部相等)

为了避免这种情况,选取头尾和中间元素,比较大小,找大小处于中间的元素为key值,实现对快排的优化,时间复杂度仍为O(nlog^n),每次调用排序的时候把key置一下.

//快排三数优化
int  GetMid(int* a, int left, int right) 
{int mid = (left + right) >> 1;// left  mid  rightif (a[left] < a[mid]){if (a[mid] < a[right]){return mid;}else if (a[left] > a[right]){return left;}else{return right;} }else // a[left] > a[mid]{if (a[mid] > a[right]){return mid;}else if (a[left] < a[right]){return left;}else{return right;}}
}

时间复杂度:O(N*logN)  空间复杂度:O(N*logN)  不稳定
 

归并排序

基本思想:

 代码实现:

//归并排序 
void merge(int*a,int*arr,int left,int mid,int right)
{//标记左半区第一个未排序的元素int l_pos=left; //标记右半区第一个未排序的元素int r_pos=mid+1;//临时数组下标的元素 int pos=left;//合并while(l_pos<=mid&&r_pos<=right){if(a[l_pos]<a[r_pos])arr[pos++]=a[l_pos++];elsearr[pos++]=a[r_pos++];} //合并左半区剩余的元素while(l_pos<=mid){arr[pos++]=a[l_pos++];}//合并右半区剩余的元素while(r_pos<=right){arr[pos++]=a[r_pos++];}//把临时数组合并后的元素复制到a中 while(left<=right){a[left]=arr[left];left++;} 
}

 时间复杂度:O(N*logN)  空间复杂度:O(N)  稳定性:稳定

基数排序

基本思想:

 

代码实现:

void CountSort(int* a, int n)
{int max = a[0], min = a[0];for (int i = 0; i < n; ++i){if (a[i] > max)max = a[i];if (a[i] < min)min = a[i];}int range = max - min + 1;int* count = malloc(sizeof(int)*range);memset(count, 0, sizeof(int)*range);for (int i = 0; i < n; ++i)//计数 {count[a[i] - min]++;}int i = 0;for (int j = 0; j < range; ++j)//排序 {while (count[j]--){a[i++] = j + min;}}free(count);
}

时间复杂度:O(MAX(N,范围))  空间复杂度:O(范围)  稳定性:稳定

排序算法复杂度及稳定性分析

 

相关文章:

八大排序

目录 选择排序-直接插入排序 插入排序-希尔排序 选择排序-简单选择排序 选择排序-堆排序 交换排序-冒泡排序 交换排序-快速排序 归并排序 基数排序 选择排序-直接插入排序 基本思想: 如果碰见一个和插入元素相等的&#xff0c;那么插入元素把想插入的元素放在相等元素…...

网络安全【黑客技术】自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 掌握技术的听说也需要心怀正义&#xff0c;不要利用技术行不轨之事&…...

【网络通信】socket编程——TCP套接字

TCP依旧使用代码来熟悉对应的套接字&#xff0c;很多接口都是在udp中使用过的 所以就不会单独把他们拿出来作为标题了&#xff0c;只会把第一次出现的接口作为标题 文章目录 服务端 tcp_servertcpserver.hpp(封装)初始化 initServer1. 创建socket2. 绑定 bindhtons —— 主机序…...

ROS2系统学习番外篇2---用VSCode开发ROS2程序

在ROS2系统学习3—第一个“Hello World”程序—即工作空间创建与包创建中已经介绍了如何创建ROS的工作空间以及包。在开发大型工程时,往往需要在IDE下面进行开发,因此本篇介绍使用VSCode来搭建ROS2开发环境的方法。 首先用VSCode打开ROS2的工作空间。 使用快捷键编译ROS2 …...

06 - Stream如何提高遍历集合效率?

前面我们讲过 List 集合类&#xff0c;那我想你一定也知道集合的顶端接口 Collection。 在 Java8 中&#xff0c;Collection 新增了两个流方法&#xff0c;分别是 Stream() 和 parallelStream()。 1、什么是 Stream&#xff1f; 现在很多大数据量系统中都存在分表分库的情况…...

【Spring】使用注解的方式获取Bean对象(对象装配)

目录 一、了解对象装配 1、属性注入 1.1、属性注入的优缺点分析 2、setter注入 2.1、setter注入的优缺点分析 3、构造方法注入 3.1、构造方法注入的优缺点 二、Resource注解 三、综合练习 上一个博客中&#xff0c;我们了解了使用注解快速的将对象存储到Spring中&#x…...

[webpack] 基本配置 (一)

文章目录 1.基本介绍2.功能介绍3.简单使用3.1 文件目录和内容3.2 下载依赖3.3 启动webpack 4.基本配置4.1 五大核心概念4.2 基本使用 1.基本介绍 Webpack 是一个静态资源打包工具。它会以一个或多个文件作为打包的入口, 将我们整个项目所有文件编译组合成一个或多个文件输出出去…...

模板学堂|SQL数据集动态参数使用场景及功能详解

DataEase开源数据可视化分析平台于2022年6月正式发布模板市场&#xff08;https&#xff1a;//dataease.io/templates/&#xff09;。模板市场旨在为DataEase用户提供专业、美观、拿来即用的仪表板模板&#xff0c;方便用户根据自身的业务需求和使用场景选择对应的仪表板模板&a…...

Wlan——射频和天线基础知识

目录 射频的介绍 射频和Wifi 射频的相关基础概念 射频的传输 信号功率的单位 射频信号传输行为 天线的介绍 天线的分类 天线的基本原理 天线的参数 射频的介绍 射频和Wifi 什么是射频 从射频发射器产生一个变化的电流&#xff08;交流电&#xff09;&#xff0c;通过…...

前端实习周记第三周周记

第二周总结 第二周主要是做了一些PC端细节内容。大的地方改的不多&#xff0c;但是小的细节蛮多。 值得一提的是&#xff0c;第二周做的微信小程序&#xff0c;改了很多逻辑。改逻辑需要与后端进行联调&#xff0c;收获很大&#xff0c;思路也愈发清楚。 记录做了什么是好习…...

Android 13 Launcher界面——移除Launcher的删除和卸载功能

目录 一.背景 二.将卸载功能进行屏蔽 三.将移除功能屏蔽 四.将Remove按钮与Uninstall按钮屏蔽...

深度学习:使用卷积神经网络CNN实现MNIST手写数字识别

引言 本项目基于pytorch构建了一个深度学习神经网络&#xff0c;网络包含卷积层、池化层、全连接层&#xff0c;通过此网络实现对MINST数据集手写数字的识别&#xff0c;通过本项目代码&#xff0c;从原理上理解手写数字识别的全过程&#xff0c;包括反向传播&#xff0c;梯度…...

docker search 镜像报错: connect: no route to host (桥接模式配置静态IP)

如下 原因 可能有多种&#xff1a; ① 没有开放防火墙端口 ② ip地址配置有误 解决 我是因为虚拟机采用了桥接模式&#xff0c;配置静态ip地址有问题。 先确认虚拟机采用的是 桥接模式&#xff0c;然后启动虚拟机。 1、打开命令行&#xff0c;输入下面指令&#xff0c;打开…...

【VUE】[Violation] Added non-passive event listener to a scroll-blocking...

环境 chrome: 115.0.5790.170vue: ^3.3.4element-plus: ^2.3.4vite: ^4.4.7 问题 [Violation] Added non-passive event listener to a scroll-blocking <某些> 事件. Consider marking event handler as passive to make the page more responsive. See <URL> …...

runit-docker中管理多个服务

runit-docker中管理多个服务 介绍Runit, systemctl和supervisor是三种不同的服务管理工具区别runit优点程序构成快速开始runit实现服务退出执行指定操作runit监管服务打印日志到syslogrunit监管服务后台运行runit监管服务一些错误总结 介绍 runit 是一个轻量级的、稳定的、跨平…...

Intune 应用程序管理

由于云服务提供了增强的安全性、稳定性和灵活性&#xff0c;越来越多的组织正在采用基于云的解决方案来满足他们的需求。这正是提出Microsoft Endpoint Manager等解决方案的原因&#xff0c;它结合了SCCM和Microsoft Intune&#xff0c;以满足本地和基于云的端点管理。 与 Int…...

Oracle DB 安全性 : TDE HSM TCPS Wallet Imperva

• 配置口令文件以使用区分大小写的口令 • 对表空间进行加密 • 配置对网络服务的细粒度访问 TCPS 安全口令支持 Oracle Database 11g中的口令&#xff1a; • 区分大小写 • 包含更多的字符 • 使用更安全的散列算法 • 在散列算法中使用salt 用户名仍是Oracle 标识…...

leetcode27—移除元素

思路&#xff1a; 参考26题目双指针的思想&#xff0c;只不过这道题不是快慢指针。 看到示例里面数组是无序的&#xff0c;也就是说后面的元素也是可能跟给定 val值相等的&#xff0c;那么怎么处理呢。就想到了从前往后遍历&#xff0c;如果left对应的元素 val时&#xff0c…...

flask---》更多查询方式/连表查询/原生sql(django-orm如何执行原生sql)/flask-sqlalchemy

更多查询方式 #1 查询&#xff1a; filer:写条件 filter_by&#xff1a;等于的值 # 查询所有 是list对象 res session.query(User).all() # 是个普通列表 print(type(res)) print(len(res))# 2 只查询某几个字段 # select name as xx,email from user; res session.…...

Chromium内核浏览器编译记(三)116版本内核UI定制

转载请注明出处&#xff1a;https://blog.csdn.net/kong_gu_you_lan/article/details/132180843?spm1001.2014.3001.5501 本文出自 容华谢后的博客 往期回顾&#xff1a; Chromium内核浏览器编译记&#xff08;一&#xff09;踩坑实录 Chromium内核浏览器编译记&#xff08;…...

AI原生前端开发实战手册:从Prompt驱动UI到Autonomous Component,2026大会首发12个可复用工程模式

第一章&#xff1a;AI原生前端开发的范式跃迁 2026奇点智能技术大会(https://ml-summit.org) 传统前端开发以“UI驱动逻辑”为核心&#xff0c;开发者手动编排状态、事件与渲染生命周期&#xff1b;而AI原生前端则将大语言模型&#xff08;LLM&#xff09;与客户端运行时深度…...

保姆级教程:在PyBullet里用UR10+Robotiq夹爪抓取鼠标,从环境搭建到避坑调参

PyBullet实战&#xff1a;UR10机械臂与Robotiq夹爪的鼠标抓取全流程解析 机械臂仿真技术正在重塑工业自动化和机器人研究的未来。想象一下&#xff0c;你刚拿到一台UR10协作机械臂和Robotiq夹爪&#xff0c;急需验证抓取算法却受限于硬件调试周期——这正是PyBullet物理引擎大显…...

BFS入门经典

#include <cstring> #include <iostream> #include <algorithm> #include <queue>using namespace std;// pair<int,int> 用来存一个点的坐标 (x, y) typedef pair<int, int> PII;const int N 110;int n, m; // n 行 m 列 i…...

DLSSTweaks深度解析:如何通过DLL注入技术解锁NVIDIA DLSS隐藏潜力

DLSSTweaks深度解析&#xff1a;如何通过DLL注入技术解锁NVIDIA DLSS隐藏潜力 【免费下载链接】DLSSTweaks Tweak DLL for NVIDIA DLSS, force DLAA on DLSS-supported titles, tweak scaling ratios & DLSS 3.1 presets, override DLSS versions without overwriting game…...

计算机毕业设计:Python天气数据爬虫可视化分析系统 Django框架 线性回归 数据分析 大数据 机器学习 大模型 气象数据(建议收藏)✅

博主介绍&#xff1a;✌全网粉丝50W&#xff0c;前互联网大厂软件研发、集结硕博英豪成立软件开发工作室&#xff0c;专注于计算机相关专业项目实战6年之久&#xff0c;累计开发项目作品上万套。凭借丰富的经验与专业实力&#xff0c;已帮助成千上万的学生顺利毕业&#xff0c;…...

深入 Hadoop 高可用:Leader、Follower 、Observer」角色详解

在 Hadoop 高可用&#xff08;HA&#xff09;架构中&#xff0c;Leader 选举是保障集群稳定的核心机制 —— 我们常听说 Leader&#xff08;主节点&#xff09;和 Follower&#xff08;从节点&#xff09;&#xff0c;但很少有人深入聊第三种关键角色&#xff1a;Observer&…...

Vue3生命周期钩子详解:从创建到销毁的全过程

Vue3 生命周期 Vue3 的生命周期钩子函数与 Vue2 有所不同&#xff0c;主要通过 Composition API 的方式使用。以下是 Vue3 的主要生命周期钩子及其用途&#xff1a; beforeCreate 在实例初始化之后、数据观测和事件配置之前被调用。此时组件的选项还未被处理&#xff0c;data 和…...

【技术前沿】大模型驱动的无损数据压缩:突破传统极限的新范式

1. 大模型如何重新定义数据压缩的极限 十年前我第一次接触数据压缩技术时&#xff0c;被那些复杂的数学公式和编码规则搞得晕头转向。当时使用的还是基于香农信息论的传统方法&#xff0c;虽然效果不错&#xff0c;但总觉得遇到了某种看不见的天花板。直到最近看到LMCompress这…...

祝贺电影《日掛中天》荣获2026亚洲艺术电影节两项提名

祝贺电影《日掛中天》荣获2026亚洲艺术电影节两项提名 。 祝贺演员辛芷蕾 提名最佳女主角&#xff1b; 祝贺演员冯绍峰 提名最佳男配角。#亚洲艺术电影节#AAFF2026#电影节#辛芷蕾#冯绍峰#电影日掛中天...

Redis命令处理机制源码探究潘

一、项目背景与核心价值 1. 解决的核心痛点 Navicat的数据库连接密码并非明文存储&#xff0c;而是通过AES算法加密后写入.ncx格式的XML配置文件中。一旦用户忘记密码&#xff0c;常规方式只能重新配置连接&#xff0c;效率极低。本项目只作为学习研究使用&#xff0c;不做其他…...