排序(上)

【常见的六大排序算法】插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序 在实现排序前,我们要先知道什么是排序。排序:简单的来说就是把一串数据按照一定的方式依次排序。例如:可以按照数字的大小升序或降序排列,或者按照英文字母的先后顺序排列等。使用这一系列的方式,就可以将一串无序状态下的数据排列成有序的数据。 阅读详情

排序算法在线演示

冒泡排序

从数组头部开始,依次进行两两数据比较,若第 i - 1 个元素大于第 i 个元素,两值互换。一轮下来就有一个最大的元素“沉底”,然后进行第二轮,从第 1 个元素到第 N - 1 个元素。

// Bubble_sort
void Bubble_sort(int A[], int N){
    for(int P = N; P > 0; P--){
        int flag = 0; /* 标识是否有元素发生互换 */
        for(int i = 0; i < P; i++){
            if(A[i] > A[i+1]){
                swap(A[i], A[i+1]);
                flag = 1;
            }
        }
        if(flag == 0) break;
    }
}
插入排序

假设第一个数是排好序的,重复取出第 i 个数(1 <= i <= N),从后往前同前面 i - 1 个数比较,若遇到一个比它大的数,把这个数插入到比它大的数前面。

// Insertion_sort
void Insertion_sort(int A[], int N){
    int i,j;
    for(i = 1; i < N; i++){
        int temp = A[i]; // 抽出第i个数
        for(j = i; temp < A[j-1] && j > 0; j--){ // 跟前面i-1个数比较
            A[j] = A[j-1];
        }
        A[j] = temp;
    }
}

简单排序的时间复杂度

对同一个序列,插入排序和冒泡排序在交换元素上是相等的,这是因为每次两两交换,消除了一个逆序对。而任一N个元素,拥有的逆序对数量是N(N - 1) / 4,所以,任意仅以相邻元素两两互换的排序算法的时间复杂度是

Ω(N2) Ω ( N 2 )

希尔排序

“跳着排序”,可能一次交换消除对个逆序对,从而提高速度。

简单的希尔排序

希尔增量序列为 N/2

/Shell_sort
// 定义增量序列Dm > Dm-1 > ... > D1 = 1
// 依次进行Dk间隔排序
void Shell_sort(int A[], int N){
    int P,i,temp;
    for(int D = N/2; D >0; D /= 2){ /* 希尔增量序列 */
        for(P = D; P < N; P ++){ /* 插入排序 */
            temp = A[P];
            for(i = P; i >= D && A[i-D] > temp; i -= D )
                A[i] = A[i-D];
            A[i] = temp;
        }
    } 

}
更多增量序列

上述希尔排序的增量序列不是互质的,这就可能导致在增量较小时,消除的逆序对过少。

  1. Hibbard 序列 Dk = 2^k - 1
  2. Sedgewick 序列

基于这两个增量序列的希尔排序的时间复杂度分析是十分复杂的。

堆排序

算法一

调成最小堆,每次弹出堆顶元素。

// Heap_sort1
// O(NlogN)
void Heap_sort(int A[], int N){
    int[] temp;
    BuildHeap(A); /* O(N) */
    for(int i = 0; i < N; i++)
        temp[i] = DeleteMin(A); /* O(logN) */
    for(int i = 0; i< N; i++)
        A[i] = temp[i]; /* O(N) */
}

复杂度是O(NlogN) 但是要挪出一半空间来拷贝元素。

算法二

调成最大堆,把堆顶元素放到最后,然后删掉最后一个元素(即对前N-1个数做堆排序)。

#define LeftChild(i) (2*(i) + 1)
#define ElementType int

void PercDown(ElementType A[], int i, int N){
    int child;
    ElementType Tmp;

    for(Tmp = A[i]; LeftChild(i) < N; i = child ){
        child = LeftChild(i);
        if(child != N-1 && A[child + 1] > A[child]) 
            child ++;
        /*左儿子不是剩下的最后一个元素,而且右儿子大于左儿子*/

        if(Tmp < A[child]){
            A[i] = A[child];
        }else {
            break;
        }
    }
    A[i] = Tmp;
}
/* - - - - - - - - - - - - - - - - - - - */


void Heap_sort(int A[], int N){
    for(int i = N/2; i >= 0; i--)
        PercDown(A, i, N); /*建立最大堆*/
    for(int i = N-1; i > 0; i--){
        swap(&A[0], &A[i]); /*Delete Max*/
        PercDown(A, 0, i);
    }
}

PercDown 是对一个元素进行检查,选择左右儿子中比它大的值(如果有)替换自己的值,然后去被取走值的儿子进行PercDown。建立堆的时候是从第 N/2 的元素(倒数的第一个有儿子的元素)往前PercDown的,大的元素不断往上走。
堆排序处理N个不同的元素的随机序列产生的比较次数是2NlogN - O(NloglogN) ,比O(NlogN) 稍微好一点。

归并排序

七大排序算法:插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序 史上最全的排序讲解 阅读详情

相关推荐

基于JavaEE的银行大客户关系维护系统(JSP+java+springmvc+mysql+MyBatis)

基于JavaEE技术的大型银行客户关系管理系统可以实现客户信息的集中管理、客户需求的分析与挖掘、个性化的服务推荐等功能。+ Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。用户发送请求:用户通过浏览器或其他客户端向系统发送请求,请求访问特定的页面或执行特定的操作。前端展示结果:前端接收到后端返回的数据,根据需要进行展示。数据返回给前端:后端程序处理完业务逻辑后,将结果数据返回给前端。后端程序接收到请求后,根据请求的类型和参数进行相应的处理。

gp1052的博客 719

所有常见排序详解

2.3希尔排序(缩小增量排序) 3.选择排序 3.1基本思想 4.交换排序 4.1基本思想 4.3快速排序 4.3.2递归+三数取中+小区间优化 4.3.3非递归+三数取中 5.归并排序 5.1基本思想 5.3归并非递归 5.3.1为什么不能使用栈......

2021wuwei 2553

如何浏览与下载全球免费的地图高分辨率(亚米级)的遥感影像?

前言 如果你想使用商业卫星的高分辨遥感影像,一般价格昂贵。我们可以使用地图平台上免费的高分辨率数据。目前数据源很多,比如说google earth、天地图、四维地球、必应地图等等。这些影像统一有一个共同点就是:RGB三波段;Web地图瓦片服务。这意味着我们可以通过瓦片服务下载影像,但下载的影像只有三个波段,分别是 一.引言 二、可使用高分辨率的地图数据源 1.Google Earth影像 2.Esri World Image 3.天地图 4.必...

锐多宝的地理空间 2万+

排序(详解)

排序

qq_68006585的博客 918

多核系统核间通信(IPC)设计:从硬件机制到软件实现

在多核处理器与嵌入式系统设计中,核间通信(IPC)是实现计算资源协同工作的核心技术。其原理基于共享内存、硬件邮箱与中断等底层硬件机制,通过构建结构化的消息传递通道,实现核间高效、可靠的数据交换。该技术的核心价值在于打破多核间的壁垒,将分散的计算单元整合为有机整体,从而显著提升系统整体性能与响应能力。在工程实践中,IPC广泛应用于智能座舱、边缘AI网关、实时控制系统等场景,用于处理如仪表显示、AI推理、实时控制等复杂任务。本文聚焦于基于共享内存与VRING的消息队列实现,深入剖析缓存一致性、内存屏障等关键问题

weixin_27006759的博客 597

不只是安装:用OrbbecSDK_ROS2玩转深度相机点云、滤波与DDS调优

本文深入探讨了如何通过OrbbecSDK_ROS2实现深度相机的高级应用,包括点云处理、深度图优化和DDS调优。详细介绍了点云采集与可视化技巧、多种滤波算法的配置与组合策略,以及针对高带宽数据传输的DDS高级调优方法,帮助开发者在机器人导航和三维重建等场景中提升性能。

weixin_29246195的博客 780

数据结构学习记录——堆的建立(最大堆的建立、思路图解、代码实现、代码解释)

对其进行调整,调整的思路和堆的删除相似,但是要从后往前开始,在左右两个堆中进行调整;从倒数第一个没有儿子的结点开始,即从最后一个非叶子节点开始,依次进行下滤操作,将其子树调整为最大堆。因为最后一个非叶子节点的数组下标为n/2,其中n为堆中元素的个数,所以从i=n/2开始循环。Parent表示当前结点的父结点,Child表示当前结点的子结点,X表示当前结点的值。然后,从要下滤的结点开始,沿着其左右子结点中较大的一个不断下滤,具体来说,每次将要下滤的结点与其左右子结点中较大的一个进行比较,

li13437542099的博客 4956

uniapp(全端兼容) - 最新详细实现瀑布流列表及布局设计,uni-app全平台兼容的瀑布流示例,view容器自适应瀑布流布局,图片瀑布流布局、图像+文字卡片式瀑布流,类似小红书(详细示例代码)

uni-app,瀑布流,安卓app,苹果app,微信小程序,移动端,H5网页,手机网站,微信小程序、支付宝小程序,手机app端,nvue,瀑布流布局,如何实现图片瀑布流,怎么做文字+图像瀑布流,uniapp仿小红书笔记瀑布流效果,uniAPP仿快手抖音布局列表,瀑布流列表详细教程,编译所有平台都能用的瀑布流列表,商品瀑布流列表,图文列表,小程序瀑布流,页面触底懒加载,瀑布流插件,详细示例代码教程,uni-app H5实现瀑布流效果,uniapp小程序做瀑布流,纯css瀑布流,用uniapp写瀑布流商品列表,

✅ 精选推荐文章 1万+

【排序】堆排序

什么是堆 堆是一棵完全二叉树,可以用数组来存储。比如一个数组[3, 8, 15, 31, 24],具体为一个堆,它的逻辑结构如下所示:(图来自https://www.cnblogs.com/jingmoxukong/p/4303826.html#堆的概念,侵删) 最大堆和最小堆 最大堆:根结点的值是所有堆结点值中最大者,且以每个节点为根的所有子堆都为最大堆。 最小堆:根结点的值是所有...

denghong637573的博客 221

西门子SMART PLC增量式PID(完整梯形图FC)

西门子PLC自带的PID指令是基于位置型的PID,位置型PID的算法公式和详细介绍,大家可以参看《PID专栏》的其它文章,这里不再赘述。本篇博文直接给出代码部分的讲解,不设计太多公式和理论的推导。限于本人能力,文中难免出现错误和不足之处,诚恳欢迎大家的批评和指正。同时感谢大家的订阅和关注。SMART200 PLC系统自带的PID指令解析,可以参看下面这篇文章:SMART PLC PID算法基本解析(附公式)_RXXW_Dor的博客-优快云博客_plc的pid算法在态运行中,控制器调节输出值,使偏差 (e

RXXW_Dor的博客 8147

YOLO26改进策略【YOLO和Mamba】| 2024 VM-UNet,高效的特征提取模块VSS block 二次创新提高精度

VM-UNet模型设计的出发点是解决现有CNN-based和模型在医学图像分割中的局限性,利用(SSMs)的优势,提出一种更有效的医学图像分割模型。具体来说,CNN-based模型在捕捉长距离信息方面存在不足,而模型由于自注意力机制的二次复杂度导致计算负担较重。SSMs模型如Mamba不仅在建模长距离依赖方面表现出色,还具有线性计算复杂度,这为VM-UNet的设计提供了理论基础。

Limiiiing的博客 215

学习随记四十六——堆排序

堆排序1、堆排序算法分析2、堆排序代码3、堆排序分析1、时间复杂度2、运行时间实例分析3、整体代码总结 注:我测试所用数据都是可以比较大小的类型且无重复元素,且排序按照升序排列。 1、堆排序算法分析   我们可以通过建立一个二叉堆来对元素进行排序,有两种思路,一是先将这些元素建立一个二叉堆,执行N次删除最大元素的操作,用一个数组接收被删除的数据,这样就得到了元素的升序排列。这个算法的主要问题就是使用了一个附加数组,增大了空间开销,第二种实现方法是因为每次删除最大元素后堆的长度减1,所以可以将被删除的元素放在

qq_53271740的博客 528

ANPC三电平拓扑双脉冲试验的原理与实施

ANPC三电平拓扑因损耗低、谐波小、应力均衡而广泛应用,但其存在短、长两类换流通道,寄生电感和开关应力差异显著。短通道尖峰小、可靠性高;长通道应力严苛。因此需分别制定两套独立双脉冲测试方案,针对不同时段和器件(如T1、T5、T6、T4及对应二极管)全面考核开关特性。

嵌入式老牛的博客 350

六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序

文章目录:1. 插入排序2.希尔排序 1. 插入排序 步骤: 1.从第一个元素开始,该元素可以认为已经被排序 2.取下一个元素tem,从已排序的元素序列从后往前扫描 3.如果该元素大于tem,则将该元素移到下一位 4.重复步骤3,直到找到已排序元素中小于等于tem的元素 5.tem插入到该元素的后面,如果已排序所有元素都大于tem,则将tem插入到下标为0的位置 6.重复步骤2~5 动图演示如下: 思路:   在待排序的元素中,假设前n-1个元素已有序,现将第n个元素插入到前面已经排好的序列中,使得前n个

HanMeng的博客 69万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

常见排序算法(插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,计数排序,基数排序,桶排序)

常见排序算法(插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,计数排序,基数排序,桶排序)

2301_80288511的博客 3158

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【算法】排序算法(插入排序、希尔排序、选择排序、冒泡排序、快速排序、归并排序、基数排序、堆排序)

八大排序算法(插入排序、希尔排序、选择排序、冒泡排序、快速排序、归并排序、基数排序、堆排序)

酷酷的馫博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

算法——十大排序(冒泡排序,选择排序,堆排序,插入排序,归并排序,快速排序,希尔排序,计数排序,基数排序,桶排序)

排序算法准备算法模板冒泡排序(Bubble Sort)定义执行流程代码实现选择排序(Selection Sort)定义执行流程代码实现插入排序(Insertion Sort)定义执行流程代码实现希尔排序(Shell Sort)定义执行流程代码实现堆排序(Heap Sort)定义执行流程代码实现归并排序(Merge Sort)定义执行流程代码实现快速排序(Quick Sort)定义执行流程代码实现计数排序(Counting Sort)定义执行流程代码实现基数排序(Radix Sort)定义执行流程代码实现桶排

mazouri的博客 5020

排序算法:插入排序、冒泡排序、选择排序、希尔排序、堆排序、快速排序、归并排序

排序算法相关总结,涉及的排序算法有:插入排序、冒泡排序、选择排序、希尔排序、堆排序、快速排序。

qq_53130059的博客 5646

简单排序——选择排序、冒泡排序、插入排序

本文利用示例和图示的方法详细阐述了简单排序(选择排序、冒泡排序、插入排序)的算法原理和过程,并给出对应的代码供读者参考。

weixin_65472178的博客 7070

【算法】六大排序 插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序

六大排序 插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序

一点一点变好 3593

排序算法:冒泡排序、插入排序、选择排序、希尔排序

相关博客: 排序算法:冒泡排序、插入排序、选择排序、希尔排序 排序算法:归并排序、快速排序 排序算法:桶排序、计数排序、基数排序 排序算法:堆排序 十大排序算法小结 一、冒泡排序: 1、算法原理: 冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系的要求。如果不满足就让它俩互换位置。一次冒泡会让至少一个元素移动到它应该在的位置,重复n...

张维鹏的博客 6477

【七大排序算法】插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序

所谓排序,就是把一堆杂乱的数据,排成升序或降序(递增/增减)。假设一组数据[1,2,9,5,5,6,8],进行升序排序后,两个5的相应位置不发生改变,即称为稳定的排序,否则就是不稳定排序。数据元素全部放在内存中进行排序。即将待排序的记录存储在外存中,排序时再把数据一部分一部分地调入内存进行排序,在排序过程中需要多次进行内存和外存之间地交换。

Original0的博客 3624

【Python排序算法】一文掌握十大排序算法,冒泡排序、插入排序、选择排序、归并排序、计数排序、基数排序、希尔排序和堆排序

一文掌握十大排序算法,冒泡排序、插入排序、选择排序、归并排序、计数排序、基数排序、布尔排序、桶排序和堆排序

qq_35831906的博客 2541

常见的五种排序,冒泡排序,选择排序,插入排序,并归排序,快速排序

冒泡排序 冒泡排序介绍: 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地跑过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小)那么它就会按照大到小的排序方式来。它必须要把算所有的元素重复地进行跑一遍,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 冒泡排序算法的原理如下: 1,比较相邻的元素。如果第一个比第二个大,就交换他们两个,如果不是相等的就跳过比下面的元素 ,这样依次的循环下去 直到所有的元素都比较完成才结束。 2,针对所有的元素重复以上的

无心 2623

【数据结构】排序合集(直接插入排序、希尔排序、冒泡排序、堆排序、选择排序、快速排序、归并排序、计数排序)

完希望这篇小小文章可以为你解答疑惑!若上述文章有什么错误,欢迎各位大佬及时指出,我们共同进步!

2401_85054434的博客 1485
上一篇: 理解TCP协议的三次握手和四次挥手
下一篇: CSS布局解决方案
扬扬羊
博客等级 码龄9年 11粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值