排序算法总结(多图)

十大经典排序算法 十大经典排序算法 根据算法的时间空间复杂度列出以下10种排序算法,其中蓝色底的为稳定排序,绿色底的为不稳定排序。 先谈一谈稳定性:稳定性简单来讲就是考虑排序后值相同的元素和排序前是否保持一致(如排序前a1和a2值相同,排序后仍是a1在前a2在后) 注:希尔排序时间复杂度在O(nlogn)~O(n2)之间 根据时间复杂度来划分成三小类排序 1.时间复杂度为O(n2) 1.1.冒泡排序(Bubble Sort) 简单的思想:数组中相邻元素两两比较[以左边大为例子,交换两者的位置];每一次. 阅读详情

点击上方“芋道源码”,选择“置顶公众号”

技术文章第一时间送达!

源码精品专栏

 

来源:http://yikun.github.io/2014/11/20/algorithm_sort/

1. 概述

算法名称复杂度实现关键
冒泡排序O(n^2)(无序区,有序区)。从无序区通过交换找出最大元素放到有序区前端。
选择排序O(n^2)(有序区,无序区)。在无序区里选择一个最小的元素跟在有序区的后面。
插入排序O(n^2)(有序区,无序区)。把无序区的第一个元素插入到有序区的合适的位置。
希尔排序nlog^2(n)每一轮按照事先决定的间隔进行插入排序,间隔会依次缩小,最后一次一定要是1(插入)。
快速排序nlog(n)(小数,枢纽元,大数)。
堆排序nlog(n)
桶排序O(n)将值为i的元素放入i号桶,最后依次把桶里的元素倒出来。

不稳定的排序:
稳定性一个形象的比喻,本来有两个并列第三,一排序把原来并列的顺序给变了。
比如:选择排序、快速排序、堆排序、希尔排序;
参考链接

2. 冒泡排序

img

每次都把未排序的第一个作为起始点,然后逐渐冒泡上升,之后未排序区越来越少,最终排序完成

img
 1// 冒泡排序
2void bubble_sort(int a[], int n)
3{
4    int i = 0;
5    int j = 0;
6    for (i=0; i<n-1; i++)
7    {
8        // 比较相邻元素,若a[j]比a[j+1]大,则交换
9        // a[j]就像一个气泡一样“浮”到合适位置了
10        for(j=0; j<n-1-i; j++)
11        {
12            if(a[j]>a[j+1])
13            {
14                swap(&a[j], &a[j+1]);
15            }
16        }
17    }
18}

3. 选择排序

img

每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

img
 1// 选择排序
2void select_sort(int a[], int n)
3{
4    int i=0,j=0,min=0;
5    for (i=0; i < n-1; i++)
6    {
7        min = i;
8        // 找到最小值
9        for (j=i+1; j <= n-1; j++)
10        {
11            if (a[min] > a[j])
12                min = j;
13        }
14        if(min != i)
15        {
16            swap(&a[min], &a[i]);
17        }
18    }
19}

4. 插入排序

img

每次排序从未排序区取一个“牌”,然后往前插入(包括了两步:大的往后移,把牌放到合适位置)。

img
 1// 插入排序
2void insert_sort(int a[], int n)
3{
4    int i=0;
5    int j=0;
6    int tmp=0;
7    for (i = 1; i < n; i++)
8    {
9        // 取牌
10        tmp = a[i];
11        // 往前插的起始位置
12        j = i - 1;
13
14        // 大的a[j]都放后面,寻找出j
15        while ((j >= 0) && a[j] > tmp)
16        {
17            // 往后放一个
18            a[j+1] = a[j];
19            j--;
20        }
21
22        // 放到该放的位置
23        a[j+1]=tmp;
24    }
25}

另外还有种思路,把数据后移的过程换成交换的过程

 1// 插入排序,选中的牌冒泡向前插入
2void insert_sort_2(int a[], int n)
3{
4    int i=0;
5    int j=0;
6    //通过i选牌
7    for (i=1; i < n; i++)
8    {
9        // 冒泡向前插入(i-1 --> 0)
10        for (j=i-1; j>=0 && a[j] > a[j + 1]; j--)
11        {
12            swap(&a[j], &a[j+1]);
13        }
14    }
15    print_a(a, n);
16}
17`

5. 希尔排序

对插入排序再加一个步长的循环就是希尔排序了,例如

1[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ]

按照5步长排序,则相当于按列先进行排序(实际是通过下标实现的)

113 14 94 33 82
225 59 94 65 23
345 27 73 25 39
410

排序后结果为

110 14 73 25 23
213 27 94 33 39
325 59 94 65 82
445

多次循环后,只需要最终步长为1即可。

 1// 希尔排序
2void shell_sort(int a[], int n)
3{
4    int i=0;
5    int j=0;
6    int tmp=0;
7    int gap=0;
8    while (gap <= n)
9    {
10        gap = gap*3 + 1;
11    }
12    while (gap > 0)
13    {
14        // 取牌
15        for (i = gap; i < n; i++)
16        {
17            // 冒泡向前插入(i-gap : gap : 0), 保证每列ok
18            for (j = i - gap; (j >= 0) && (a[j] > a[j + gap]); j = j - gap)
19            {
20                swap(&a[j], &a[j+gap]);
21            }
22        }
23        gap = (gap-1) / 3;
24    }
25}

6. 快速排序

img


每次迭代都选出一个基准,左边放小的,右边放大的,最终迭代完成。

img
 1// 快速排序分区
2static int partition(int a[], int p, int r)
3{
4    int x=0;
5    int i=0;
6    int j=0;
7    // x为基准
8    x = a[r];
9    // i为界限,发现小于x的,就i++,再放到i处
10    i = p-1;
11    for (j=p; j<= r-1; j++)
12    {
13        if (a[j]<=x)
14        {
15            i++;
16            swap(&a[i], &a[j]);
17        }
18    }
19    // 至此,所有小于x的都到i左边了(a[0]~a[i-1]),a[r]是x,因此交换a[i+1]和a[r]
20    swap(&a[i+1], &a[r]);
21    return i+1;
22}
23
24// 快速排序
25void quick_sort(int a[], int p, int r)
26{
27    int q=0;
28    if (p < r)
29    {
30        // 在数据集之中,选择一个元素作为"基准"(pivot)
31        // 所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边
32        q = partition(a, p, r);
33        // 对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
34        quick_sort(a, p, q-1);
35        quick_sort(a, q+1, r);
36    }
37}


如果你对 Dubbo / Netty 等等源码与原理感兴趣,欢迎加入我的知识星球一起交流。长按下方二维码噢:


目前在知识星球更新了《Dubbo 源码解析》目录如下:

01. 调试环境搭建
02. 项目结构一览
03. 配置 Configuration
04. 核心流程一览

05. 拓展机制 SPI

06. 线程池

07. 服务暴露 Export

08. 服务引用 Refer

09. 注册中心 Registry

10. 动态编译 Compile

11. 动态代理 Proxy

12. 服务调用 Invoke

13. 调用特性 

14. 过滤器 Filter

15. NIO 服务器

16. P2P 服务器

17. HTTP 服务器

18. 序列化 Serialization

19. 集群容错 Cluster

20. 优雅停机

21. 日志适配

22. 状态检查

23. 监控中心 Monitor

24. 管理中心 Admin

25. 运维命令 QOS

26. 链路追踪 Tracing

... 一共 69+ 篇

目前在知识星球更新了《Netty 源码解析》目录如下:

01. 调试环境搭建
02. NIO 基础
03. Netty 简介
04. 启动 Bootstrap

05. 事件轮询 EventLoop

06. 通道管道 ChannelPipeline

07. 通道 Channel

08. 字节缓冲区 ByteBuf

09. 通道处理器 ChannelHandler

10. 编解码 Codec

11. 工具类 Util

... 一共 61+ 篇

目前在知识星球更新了《数据库实体设计》目录如下:

01. 商品模块
02. 交易模块
03. 营销模块
04. 公用模块

... 一共 17+ 篇

源码不易↓↓↓↓↓

点赞支持老艿艿↓↓


数据结构-各种排序算法效率对比图 排序法 平均时间复杂度 最差情形 稳定度 额外空间 备注 冒泡排序 O(n2)  O(n2) 稳定 O(1) n小时较好 交换排序 O(n2)  O(n2) 不稳定 O(1) n小时较好 选择排序 O(n2) O(n2) 不稳定 O(1) n小时较好 插入排序 O(n2) O(n2) 稳定 O(1) 大部分已 阅读详情

相关推荐

19、图与搜索排序算法详解

本文详细介绍了图的基本概念及其在多个领域的应用,并探讨了常见的图搜索与遍历算法,如广度优先搜索(BFS)和深度优先搜索(DFS)。同时,文章还分析了常见的搜索算法(包括线性搜索、二分搜索和插值搜索)的原理、实现及效率对比。此外,对常用排序算法(如冒泡排序、快速排序、归并排序)的时间复杂度和适用场景进行了总结。最后,结合实际应用场景,给出了如何选择合适的图、搜索和排序算法的综合建议,以提高程序性能和数据处理效率。

tcp8optimizer的博客 117

【优选算法】九大排序算法(插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,计数排序,基数排序)

【优选算法】九大排序算法(插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,计数排序,基数排序)

52Herzt的博客 1万+

c语言压力变送器程序设计,基于单片机的压力变送器设计

基于单片机的压力变送器设计(任务书,开题报告,外文翻译,论文15000字,代码)摘要随着工业化水平的不断提高,新型智能仪表在工业生产过程中运用也越来越广泛,同时对输出数据的准确检测和处理也变得至关重要。生产过程的运行和设备安全是极其重要的,那么如何实现对其精确的检测呢?众所周知,在工业生产过程中有一个很重要参数——压力,显然这个参数是一个必不可少的条件。故而,研究智能压力变松器系统对工业生产有着不...

weixin_33681561的博客 1966

十大经典排序算法(超详细)

排序是我们数据结构中不可或缺的算法,也是面试官HR最爱问的问题之一,所以要清楚排序就要明白排序的核心思想是什么,什么样的排序时间和空间复杂度更低,什么情况下用什么样的排序会更优。最常见的就是十大经典排序:冒泡排序、选择排序、堆排序、插入排序、希尔排序、快速排序、归并排序、基数排序、计数排序和桶排序。

脑袋空空的博客 1536

基于OpenAI Agents构建多智能体工作流:从原理到实战

多智能体系统(Multi-Agent System)是人工智能领域的重要分支,它通过多个智能体(Agent)的协作与交互,解决单一智能体难以处理的复杂任务。其核心原理在于将任务分解、分配与协调,每个智能体具备特定能力,通过通信机制实现信息共享与决策协同。在工程实践中,多智能体框架的价值在于提升任务处理效率、增强系统鲁棒性,并支持模块化开发。典型的应用场景包括自动化工作流编排、复杂问题求解以及人机协同交互。本文以OpenAI Agents SDK为例,深入探讨如何利用其提供的智能体(Agent)、会话(Ses

weixin_28725959的博客 606

第一届“龙信杯”电子数据取证竞赛Writeup

第一届“龙信杯”电子数据取证竞赛Writeup

toto的博客 1万+

推荐系统中的排序概述

推荐系统中的排序学习1.为什么需要排序学习1.1 排序学习在推荐领域的重要作用2.排序学习框架2.1.基本流程2.2.特征提取2.3.标签获取2.3.1人工标注2.3.2 日志抽取3.排序学习设计方法3.1.单点法(Pointwise)推荐领域的 Pointwise 排序学习3.2 配对法(Pairwise)Pointwise与Pairwise的结合方案3.3 列表法(Listwise) 排序学习(Learning to Rank,LTR),也称机器排序学习(Machine-learned Ranking,

m0_37531129的博客 2458

深入分析大众点评 Ajax 接口:直接请求 JSON 数据高效获取评论

大众点评网站采用前后端分离架构,通过Ajax接口动态加载数据。按F12打开开发者工具,切换到Network(网络)面板。实际环境中,我们需要使用Python重现这一加密逻辑。查看请求响应,寻找包含评论数据的JSON接口。参数是大众点评的反爬机制核心,需要特别处理。:尊重网站的robots.txt文件规定。:仅将数据用于合法合规的研究和分析目的。:不侵犯大众点评的商业秘密和知识产权。打开大众点评网站,进入任意商户页面。:对采集到的用户信息进行脱敏处理。:避免对目标网站造成过大负担。

Z_suger7的博客 1590

推荐系统——排序算法综述

常见排序算法有:

weixin_39586997的博客 2311

vivado生成及调用自定义IP的方法

开发环境:vivado 2018.2 1.将整个工程封装为自定义IP 将整个工程封装为自定义IP主要有以下步骤: 步骤1.选中工程中的top模块。点击Tools ------> Create and Package New IP,如图1所示 图1 步骤2.弹出界面后,点击next至图2界面,选择Package your current project,然后继续点击next 图2 步骤3.选择生成的IP路径,如图3所示。这个路径就是后续添加该IP的路径 图3 步骤4.继续点击next,然后选择fi

进击的阿日比 4735

【AI大模型:认知升级】1、全面解析AI大模型:从起源到发展脉络与应用价值

AI大模型是具备超大规模参数(千亿至万亿级)、海量训练数据(TB级)和强迁移学习能力的基础模型。其技术特征包括Transformer架构革新、大数据预训练范式及参数规模超过临界值后的能力涌现。发展历程经历了语言模型突破(2018-2020)、多模态融合(2021-2023)和架构创新(2023至今)三波浪潮,遵循数据、算力、算法协同进化规律。底层驱动因素包括能力涌现机制、算力基础设施突破和应用场景拓展,正在重构产业价值链。通过"知识星系""认知

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 2294

十大排序算法--多图预警

十大排序算法 十大排序算法 简单的排序算法 插入排序 冒泡排序 选择排序 高效的比较排序算法 希尔排序 快速排序 归并排序 堆排序 牺牲空间的线性排序算法 计数排序 桶排序 基数排序 综合分析 简单的排序算法 Θ(n^2) 插入排序 动画演示 ...

weixin_30485379的博客 195

Codex 实战 Skills:如何用 Skill 让 AI 模拟人工点击,自动完成复杂的前端表单测试

本文介绍如何构建基于Selenium WebDriver的AI Agent技能,实现自动化UI测试流程。主要内容包括: 环境搭建:配置无头Chrome浏览器环境,使用WebDriver Manager自动管理驱动 核心技能开发:通过ID、CSS Selector、XPath等策略定位元素,实现显式等待机制 交互模拟:使用ActionChains模拟鼠标悬停等复杂操作 稳定性优化:解决异步加载问题,确保测试可靠性 Skill封装:将功能模块化,使AI能通过自然语言指令操作Web界面 该方案突破了传统自动化测试

yueyeguzhuo的专栏 150

『多图警告』手撕排序算法 - 前端进阶必备

作者:陈大鱼头github:https://github.com/KRISACHAN算法是什么?算法(Algorithm) 已经是一个老生常谈的概念了,最早来自于数学领域...

奇舞周刊 334

使用 Python 爬虫抓取 IMDb 电影信息 - 评分、评论与基本信息抓取教程

本文介绍了如何使用 Python 爬虫技术抓取 IMDb 电影评分、评论和基本信息。我们分别展示了通过IMDb API和两种方法抓取数据,并进行了数据存储、分析与可视化。在未来,我们还可以基于这些数据开发电影推荐系统、情感分析工具等,进一步丰富电影数据的应用场景。通过这些实践,您不仅学会了如何抓取和存储数据,还可以通过这些基础来构建自己的数据分析应用,获取更丰富的电影数据。

2201_76125261的博客 601

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

「多图警告」手撕排序算法 - iOS进阶必备

点击蓝色“五分钟学算法”关注我哟加个“星标”,一起学算法作者 | Lefex来源 | 超越技术整理 | 程序员小吴冒泡排序冒泡排序是通过比较两个相邻元素的大小实现排序,如...

程序员吴师兄的博客 510

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...

单链表的冒泡,快排,选择,插入,归并5种排序算法详解(多图+代码实现)

上节介绍了链表的基本操作https://blog.youkuaiyun.com/qq_16933601/article/details/105125038。 这节介绍链表的5种排序算法。 文章目录0.稳定排序和原地排序的定义1.冒泡排序2.快速排序3.插入排序4.选择排序5.归并排序 0.稳定排序和原地排序的定义 稳定排序:   假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的...

嵌入式与Linux那些事的博客 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【排序算法】图解冒泡排序(多图+解决两种无效比较问题)

本文主要介绍冒牌排序算法,通过图片一步步解释每一趟每一次的交换。并且,本文在给出冒泡排序基础版代码后,分析了基础版存在的两个问题,解决该问题可以避免出现不必要的比较。代码通过C#实现,并输出每一次交换的情况和比较次数,方便各位小伙伴比较算法的优缺点。......

baidu_33146219的博客 2万+

一趟快速排序的实质结果是什么_多图警告手撕排序算法 iOS进阶必备

作者 | Lefex来源 | 超越技术整理 | 程序员小吴冒泡排序冒泡排序是通过比较两个相邻元素的大小实现排序,如果前一个元素大于后一个元素,就交换这两个元素。这样就会让每一趟冒泡都能找到最大一个元素并放到最后。以[ 8, 1, 4, 6, 2, 3, 5, 7 ]为例,对它进行冒泡排序:代码实现:+(NSArray*)bubbleSort:(NSArray*)unsortDa...

weixin_29112009的博客 381

UEditor上传图片后,展示的顺序与选择时顺序不一致(多图上传)

UEditor多图上传时,由于后台上传接口返回的时间不同,会造成显示上传后的图片与选择时的图片顺序不一致的问题。 举个栗子: 多图上传时,先后选择了a.png和b.png,其中a.png大小为900k,b.png大小为5k,当上传成功后点击确认按钮, 发现b.png在a.png前面。即选择的时候顺序为 a.png 、b.png,而上传成功后显示的顺序为b.png 、 a.png ,因为a.pn...

雷欧奥特曼的博客 5083

matplotlib添加子图(拼图功能)

  我们已经知道,matplotlib是python中的一个十分好用的作图库,它的简单的使用方法可以在之前的随笔中找到。传送门:https://www.cnblogs.com/chester-cs/p/11879444.html   之前没有涉及到的是一个用途十分广泛的功能:子图(拼图功能),想象我们有四个对比曲线图,是一个问题不同的算法实现结果。假如一个图接一个图画的画太拖沓,我们又不...

思念殇千寻的博客 3135

十大经典排序算法(动图演示C++实现)

参考:https://www.cnblogs.com/onepixel/articles/7674659.html 十大经典排序算法(动图演示C++实现) 0、算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: (选泡插,快归堆希统计基) 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排...

zhangsy_csdn的博客 1万+

【java】十大经典排序算法(动图演示)

十大经典排序算法(动图演示) 0,算法概述 0.1算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。  0.2算法复杂度 ...

csdn_baotai的博客 1万+

十大经典排序算法(动图演示)

0.1 算法分类比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。0.2 算法复杂度0.3 相关概念稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。时间复杂度:对排序数据的总的操作次数。

2255
上一篇: 点我达分布式任务调度系统-DaJob
下一篇: Java 函数式编程和 lambda 表达式
公众号-芋道源码
博客等级 码龄10年 1636粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值