排序算法总结-Shell排序、归并排序、快排、堆排

排序算法可视化:从冒泡到快排的原理与工程选型 排序算法是数据结构与算法学习中的核心内容,也是面试和工程实践的高频考点。理解不同排序算法的时间复杂度、空间复杂度和稳定性至关重要,但仅靠代码模板很难建立动态直觉。通过可视化演示,可以直观观察元素比较、交换与移动过程,深入理解冒泡排序、快速排序、归并排序等11种经典算法的工作原理。从O(n²)的冒泡、选择、插入排序,到O(n log n)的归并、快排、堆排序,再到计数排序、桶排序等非比较排序,每种算法都有其适用场景。实际工程中,应根据数据规模、有序性、内存限制和稳定性需求选择合适的排序策略,同时善用语言内置的 阅读详情

本章是对排序算法的一个总结,包括原理,代码,时间复杂度,空间复杂度等,总结内容不包括基础算法,如冒泡排序,插入排序,选择排序,另外文中代码均为手打,只展示核心思想,未经编译器测试。
对此约定一些基础函数:

  • void swap(num,a,b); //交换数组num中序号为a,b的数组元素
  • int max(a,b);//返回a,b中较大值。

Shell排序

shell排序基于插入排序,可以说是插入排序的改进版,大规模的排序数组会很麻烦,因为它只会交换旁边两个数字,所以数组只能一个一个的交换到远端去,所以我们希望能够让较大的数字能够提前到达后面去,降低后续排序交换次数。由此shell排序应运而生,其思想就是让任意相隔h的元素有序,h由大变小到为1,最后整个数组有序。

//num为排序数组,N为数组长度
void shellSort(int num[],int N){

int h=0;
while(h<N/3) h=h*3+1;  //1 4 13 40. ...这些数是由某些专家研究出来目前最高效的h
   while(h>=1){
for(int i=h;i<N;i++){
 //每次分成相隔h的一组元素,对其进行直接插入排序。
 // 例如当h为2,数组为1 2 3 4 5 6时,其分成了1 3 5,2 4 6这两组。
  for(int j=i;j>=h;j=j-h) 
  {
               if(num[j]<num[j-h]) //移动位置
               swap(num,j,j-h);
               else //移动到了合适位置
               break;
   }
}
h=h/3;
}
}

希尔排序的性能目前无法准确的描述,影响其性能因素之一递增序列,即h,目前使用上述代码中的即可。
如无法理解需详解可移步shell排序详解

归并排序

归并排序利用了分治的思想,一组排序数中划分成n个数组,对每个子数组排序后,归并成一个更大的数组,解释下归并过程,假设数组a左右两半已经排序好了,将其复制到数组b,然后对照数组b将其一个个从大到小排入a中就行了。归并排序有两种实现思想,一种是自顶向下,一种是自底向上。

  • 自顶向下是利用递归,从最大分组开始,分成两半,左边递归排序好,右边递归排序好,最后合并。
  • 自底向上是遍历数组,从最开始的两个数为分组合并,层层往上,直到全部排序好。
    合并函数:
void merge(int low,int mid,int hi){
int i=low,j=mid+1;
 for(int i=0;i<=hi;i++)
    aux[i]=num[i]; //复制数组 
 for(int k=low;k<=hi;k++)
 {
  if(i>mid) a[k]=aux[j++]; //左边已经选完了
   else if(j>hi) a[k]=aux[i++]; //右边已经选完了
   else if(aux[i]>aux[j]) a[k]=aux[i++];
   else a[k]=aux[j++];
}
}

自顶向下归并排序

void sort(int low,int hi)
{
      if(hi<=low) return ;
      int mid=low+(hi-low)/2;
      sort(low,mid);//递归排序左边
      sort(mid+1,hi);//递归排序右边
      merge(low,mid,hi);
}

自底向上归并排序

 void sort(int N,int num[]){ //N为数组长度,num[]为数组
 for(int i=1;i<N;i=i+i;)//将其分割成i+i大小的子数组。
 for(int lo=0;lo<N-i;lo=lo+i+i) //对子数组左右进行归并
 merge(lo,lo+i-1,min(lo+i+i-1,N-1));
}

归并排序时间复杂度最小最坏都为NlogN,比较次数为1/2NlogN~NlogN,空间复杂度为N。
优化:对小规模数组使用插入排序

快速排序

快排是一种分治的排序算法,它与归并排序有些许类似,快排的排序方式是当两个子数组有序的时候整个数组也自然有序了,其数组切分位置取决于数组内容。一般将数组第一个数设为分割点,将大于此数的放右边,小于此数的放左边。再依次对左右两边递归使用,完成排序。


     void sort(int a[],int low,int hi)
    {
      if(hi<=low) return;
      int i=low,j=hi+1;
      int v=a[low];//以a[low]作为切分点
      while(i!=j){
    while(a[--j]>v&&i<j)
        if(i==hi) break; //从右边找到一个小于切分点的
    while(a[++i]<v&&i<j)
    if(j==low) break;//从左边找到一个大于切分点的
    if(i>=j) break;
    swap(a,i,j);//交换两数
    }
    swap(a,j,low); //最后将切分点与a[j]交换
    sort(a,low,j-1); //继续处理左边
    sort(a,j+1,hi);//继续处理右边

    }

快速排序平均复杂度NlogN,最坏和冒泡排序一样N平方。比较次数平均2NlnN~N2/2次比较。
改进:小数组用插入排序,三取样切分法。

堆排序

移步堆排序

头歌:排序学习效果自测-练习题 | 快排、冒泡、堆排、归并、基数、递归、希尔、计数 基本思想是:首先用要查找的关键字k与中间位置的结点的关键字相比较,这个中间结点把线性表分成了两个子表,若比较结果相等则查找完成;若不相等,再根据k与该中间结点关键字的比较大小确定下一步查找哪个子表,这样递归进行下去,直到找到满足条件的结点或者该线性表中没有这样的结点。希尔排序每次是对划分的子表进行排序,得到局部有序的结果,所以不能保证每一趟排序结束都能确定一个元素的最终位置。不一定会位于最终的位置,因为不确定后面插入的元素对于前面的元素是否产生影响。选出的枢轴在一趟排序中就位于了它最终的位置。 阅读详情

相关推荐

脑影像分析工具JuSpace:跨模态关联的神经递质系统研究利器

JuSpace是一款专业的脑影像分析软件,专为跨模态关联研究设计。它能够将功能或结构磁共振影像与神经递质PET/SPECT图谱进行空间关联分析,帮助研究者探索宏观脑影像异常与微观神经化学系统(如多巴胺、血清素)之间的潜在联系,是神经精神疾病机制研究的强大工具。

c2d3e4f的博客 542

堆排/快排/希尔/归并排序,谁更快?

文章目录前因后果排序源码堆排代码快排代码希尔排序代码归并排序代码测试环境100w数据量下的效率测试快排>希尔>归并>堆排1000w数据下的测试快排>希尔>归并>堆排(差距拉大)1亿数据量的测试快排>希尔>归并>堆排(差距拉到两倍)总结皇城PK,个人的快排VS std::sort()数据量1亿测试测试时间对比(娱乐一下: 前因后果 好久没有再亲自写排序方法了,最近写题突然就又碰到了堆排,然后灵机一动,试一试我现在掌握的这些O(nlogn) 级别的排序算

CppYyds的博客 2346

如何用Arduino和HX711压力传感器制作一个简易电子秤(含OLED显示)

本文详细介绍了如何使用Arduino、HX711压力传感器和OLED显示屏制作一个简易电子秤。从硬件连接到软件编程,提供了分步教程,包括核心元件功能解析、接线方法、库安装、模块测试以及关键的校准流程。项目实践性强,适合创客和DIY爱好者学习嵌入式系统与传感器应用。

tea88的博客 536

数据结构与算法(十一):归并排序、快速排序

算法原理及其比较 算法基本思想: 归并和快排都是属于分治思想,其不同之处在于: 归并排序首先将原始序列不断二分,最后从叶子结点处,自底向上进行归并;而快速排序则自顶向下地进行,每次随机选择一个元素,将序列分为小于等于和大于该元素的两个序列; 空间复杂度方面,归并排序由于无法原地排序,其空间复杂度为,快排可以原地排序,其空间复杂度为; 时间复杂度方面,归并排序不管是最好情况、最坏情况,还是平均情况,时间复杂度都是 ;而快排则除了最坏情况下为,其余情况为. Python实现 归并排序: d.

AI数据工厂 348

利用Matlab实现矩形波导电磁场分布图的绘制

1.利用Matlab实现矩形波导电磁场分布图的绘制;2.学会使用 Matlab 进行数值计算,并绘出相应的图形;通过Matlab 计算并绘出任意时刻金属矩形波导的主模 TE10 模的电磁场分布图。波导尺寸、工作频率及时刻均由外部给定。(1)矩形波导中传输的主模为TE10模。设金属波导尺寸为a*b,TE10模的截止波长为2*a。其电磁场分量可推导表示如下:.......1-1上式中各参量如下:......1-2。

qq_26335381的博客 3058

决策规划算法四:Piecewise Jerk Path Optimizer

一,问题分析 路径规划的本质目的:规划出一条安全(无碰撞),舒适(平滑),符合车辆运动学的轨迹。 如下图所示,决策算法开辟凸空间后,路径规划算法用数值优化的方法搜索出一条最优路径,即将问题转化为二次规划的问题,采用二次规划的求解器进行求解。 二次规划问题的求解顺序: 1,确定优化变量 2,确定目标函数 3,确定约束条件 4,将目标函数和约束条件变形为二次规划的标准形式 5,用二次规划求解器进行求解,获得优化变量的序列,使得目标函数取得最小值。 注:路径的最终表达式为:,..

肥嘟嘟的左卫门 8560

Shell编程之排序

Shell编程之排序,包含冒泡排序、选择排序、插入排序、反转排序、睡眠排序以及希尔排序等,含详细讲解原理,以及图文讲解,配合示例,以及代码行

欲买桂花同载酒 3706

Intel RealSense D435深度相机实战:从数据采集到点云生成的完整避坑指南

本文详细介绍了Intel RealSense D435深度相机的实战应用,从数据采集到点云生成的完整流程,并提供了避坑指南。内容包括环境配置、硬件调优、数据采集技巧、点云生成核心技术及典型场景解决方案,帮助开发者高效利用D435进行机器人导航、三维重建等应用。

weixin_29054195的博客 472

shell的排序

shell的排序

m0_71931851的博客 2173

DO-254标准详解:航空电子硬件设计保证指南全方位解析

RTCA DO-254, 也被称为《机载电子硬件设计保证指南》,是航空电子硬件设计和验证中的关键标准,旨在为确保机载电子硬件的安全性提供设计保证。自2000年首次发布以来,DO-254就成为了民航和军用飞机中电子硬件设计认证的基准文件。随着航空硬件技术的进步和日益复杂化,确保硬件设计的准确性、可靠性和安全性变得至关重要。本标准是由RTCA和EUROCAE共同开发的,适用于涉及机载硬件的航空公司、飞机制造商、供应商和认证机构。

qq_41854911的博客 3682

一篇把 Transport 做到可复制的实战指南:从 CTS 底层表到 LSMW、Variant、Layout、TABU、Query、SAPscript 全对象搬运

本文深入解析SAP系统中的Transport机制,将其视为可审计、可追溯的变更流水线。文章从CTS/Transport Organizer通用方法论和具体对象搬运手法两个层面展开,详细介绍了LSMW项目、程序Variant、屏幕/ALV Layout、表数据、ABAP Query、SAPscript和SO10标准文本等对象的传输策略。通过真实案例说明,代码对象往往能被正确传输,但"运行体验"和"业务配置"却常被遗漏,导致QAS测试正常而PRD环境异常。文章提供了一套可

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 170

shell排序详解

shell排序详解

m0_56921470的博客 3915

【Dify】知识库智能检索应用

本文介绍了一个基于大语言模型的知识库检索系统,实现从自然语言提问到智能回答的自动化流程。该系统通过知识检索节点定位相关信息,利用重排序模型优化结果,最后由大语言模型生成自然语言答案。核心模型包括InternLM2-7B和BCE重排序模型。工作流程包含输入问题、检索重排序、智能生成和答案输出四个阶段,适用于企业知识管理、客户支持、教育培训等多种场景,能显著提升信息检索效率和准确性。文章还提供了相关开发文档链接,涵盖AIGC工具平台搭建、常见问题解决等内容。

Mr数据杨 1000

【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)

今天就写一篇关于排序的文章,本文章包含了,如标题所写的八大排序。八大排序各有各的使用场景,在某个特定场景,那么可能有一个排序就非常适合,所以排序我们是多多益善。

2302_81249757的博客 2358

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

排序方法详解与JavaScript实现 - 直接插入、shell排序、直接选择、堆排、冒泡、快排、归并、基数

排序方法总结 -- 排序过程 目录 直接插入 shell 排序 直接选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 各种排序算法的稳定性,时间复杂度,空间复杂度总结: 类别 排序方法 平均 最好 最坏 辅助存储 稳定性 插入排序 直接插入 O(n^2) O(n) O(n^2) O(1) 稳定...

sisi_chen的博客 553

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

shell编程之多种排序算法及实现代码

文章目录前言排序算法之冒泡排序算法介绍脚本演示排序算法之快速排序算法介绍脚本演示排序算法之插入排序算法介绍脚本演示排序算法之计数排序算法介绍脚本演示 前言 对数据进行分析的时候经常需要对数据进行序处理,比如按占用CPU的时间对进程进行排序、按出现的次数频率对数据排序、按大小对数据进行排序。当然对数据排序我们可以使用sort命令,而这次我们介绍的是通过编写shell排序脚本对,对数据进行自定义排序...

小叮当的博客 2329

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

java七大排序(冒泡、选择、shell、插入、快排、归并、堆排) 图文详解

java 七大排序 一共有7种排序 1、冒泡排序 所以时间复杂度最好和最坏都是O(n^2),空间复杂度为O(1) 很稳定 但是加一个判断语句Swap之后: 时间复杂度最好O(n),最坏是O(n^2),避免了数组原来有序,导致许多无用功。空间复杂度为O(1) ,很稳定。 public class maopao { private static void bubbleSort(int []...

weixin_44579258的博客 564

常见经典排序算法学习总结(插入、shell、冒泡、选择、归并、快排等)

博主在学习过程中深感基础的重要,经典排序算法是数据结构与算法学习过程中重要的一环,这里对笔试面试最常涉及到的7种排序算法(包括插入排序、希尔排序、选择排序、冒泡排序、快速排序、堆排序、归并排序)进行了详解。每一种算法都有基本介绍、算法原理分析、算法代码。 插入排序 1)算法简介 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对

Hao_09的专栏 4322

各种排序算法的实现,总结与比较

(一)排序基本概念:  根据排序过程中待排序文件存放的位置不同,可以把排序分为内部和外部排序两大类。在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序;在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序。内部排序适用于记录个数不很多的较小待排序文件的排序;外部排序则适用于记录个数太多不能一次全部放入内存的较大待排序文件的排序。(二)

鲲鹏望舒 3061

排序算法总结之快速排序、归并排序、shell排序

快速排序:快排效率高,时间复杂度最理想为 O(nlogn) ,最差时间为O(n^2),该算法不稳定。其主要思想如下:快排是每次将序列第一个数当作一个参考值,分别将比参考值大的数放到参考值右侧,小于参考值的数放到参考值左边,将序列一分为二,对得到的两个数列再分别进行上述操作,直到排序完成。实现过程: 快排程序: 归并(分治)排序: 归并排序实质上是对将序列拆分为有序序列,然后对有序序列进行合并,

Dandelion_gong的博客 1783

【排序算法】常见排序算法知识体系详解

它的基本思想是: 对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中;开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。它的基本思想是: 选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾。

cxsj986的博客 746

排序算法之shell,归并,快排

1. 快速排序快速排序可能是应用的最为广泛的一种算法,它流行的原因是实现简单,适用于各种不同的输入数据且在一般的应用中比其他排序算法都要快的多。快速排序的优点: 是原地排序(只需要一个很小的辅助栈)。 所需时间跟NlgN成正比。 快速排序思路:快速排序和归并排序是互补的,归并排序将整个数组分成小数组,然后将排好序的小数组归并以将整个数组排序;而快速排序是在将大数组分成小数组的时候排序,当小数组

微小的鱼的博客 639

Ultralytics YOLO 线程安全推理指南:多线程环境下共享模型的风险与正确实践

线程安全是多线程推理最常见的隐患之一。Ultralytics 官方文档《Thread-Safe Inference with YOLO Models》明确指出:**在 Python 多线程中跨线程共享同一个 `YOLO` 模型实例会引发竞态条件(race condition)**,导致模型内部状态被并发修改、推理结果不可预测。本文以该指南为骨架,结合当前仓库中 `ThreadingLocked`

gitblog_00399的博客 1084

8大排序算法稳定性深度解析:从冒泡到堆排,3类场景实战选型指南

本文深入解析8大经典排序算法的稳定性原理,包括冒泡排序、快速排序、堆排序等,并针对多字段排序、大数据量排序和内存敏感环境三大场景提供实战选型指南。特别强调排序算法稳定性在数据库系统和用户界面中的重要性,帮助开发者根据具体需求选择最优算法。

weixin_34166472的博客 421

快速排序、双路快排、插入排序、冒泡排序、选择排序、堆排序、归并排序、基数排序

本文主要讲诉了常见的排序算法,还有排序算法的一些升级版,例如双路快排等

Durian_piza的博客 307
上一篇: 数据结构与算法-堆、基于堆实现的优先队列、堆排序
下一篇: LeetCode 215. Kth Largest Element in an Array-快速排序的灵活使用
HJsir
博客等级 码龄10年 19粉丝 37原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值