0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

实用的排序算法 - 交换排序

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-20 09:53 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

写在前面 Ⅰ

前面写了关于ADC采集电压的文章,大家除了求平均的方式来处理采样值,还有没有使用到其他的方式来处理采集值呢?

在某些情况下就需要对一组数据进行排序,并提取头特定的数据出来使用。

排序的应用场合很多,我这里就不再一一举例说明,掌握排序的基本算法,到时候遇到就有用武之地。

排序算法分类 Ⅱ

1.按存储分类:内部排序和外部排序

内部排序:是数据记录在内存中进行排序;

外部排序:是因排序的数据很大,一般一次不能容纳全部的排序记录,在排序过程中需要访问外存。

内部排序高速、有效,是我们比较常用的排序方法。外部排序速度慢,效率低,一般不建议使用外部排序,比较实用的排序还是只有内部排序。

2.内部排序分类:插入排序、选择排序、交换排序、归并排序、基数排序。

排序的分类大致为如下图:

在内部排序中,最常见、有效且实用的排序算是交换排序,本文将在下面章节重点讲述交换排序中的冒泡排序和快速排序。

交换排序 Ⅲ

1.冒泡排序

冒牌排序是我们读书时最先接触的一种排序算法,也是比较经典的排序算法。

冒泡排序就是在要排序的一组数中,对当前还未排好序范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

原始的冒泡排序函数:

void bubbleSort(int a[], int n)

{

for(int i =0 ; i< n-1; ++i)

{

for(int j = 0; j < n-i-1; ++j)

{

if(a[j] > a[j+1])

{

int tmp = a[j];

a[j] = a[j+1];

a[j+1] = tmp;

}

}

}

}

其实,原始的冒泡排序不是最后的算法,如果进行某一趟排序时并没有进行数据交换,则说明数据已经按要求排列好,可立即结束排序,避免不必要的比较过程。

对冒泡排序常见的改进方法是加入标志性变量,用于标志某一趟排序过程中是否有数据交换。

第1种改进法:设置一标志性变量pos,用于记录每趟排序中最后一次进行交换的位置。由于pos位置之后的记录均已交换到位,故在进行下一趟排序时只要扫描到pos位置即可。

void Bubble_1( int r[], int n)

{

int pos = 0;

int i;

int j;

int tmp;

i = n - 1;

while(i > 0)

{

for(j=0; j

{

if(r[j] > r[j+1])

{

pos = j; //记录交换的位置

tmp = r[j];

r[j] = r[j+1];

r[j+1] = tmp;

}

}

i= pos;

}

}

第2种改进法:传统冒泡排序中每一趟排序操作只能找到一个最大值或最小值,我们考虑利用在每趟排序中进行正向和反向两遍冒泡的方法一次可以得到两个最终值(最大者和最小者) , 从而使排序趟数几乎减少了一半。

void Bubble_2(int r[], int n)

{

int low = 0;

int high= n -1;

int tmp,j;

while(low < high)

{

for(j=low; j//正向冒泡,找到最大者

{

if(r[j]> r[j+1])

{

tmp = r[j];

r[j]=r[j+1];

r[j+1]=tmp;

}

--high;

for(j=high; j>low; --j)//反向冒泡,找到最小者

{

if(r[j]

{

tmp = r[j];

r[j]=r[j-1];

r[j-1]=tmp;

}

++low;

}

}

}

}

2.快速排序

大致步骤如下:

1)选择一个基准元素,通常选择第一个元素或者最后一个元素。

2)通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的元素值比基准值大。

3)此时基准元素在其排好序后的正确位置。

4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。

举例:

对无序数组[6 2 4 1 5 9]排序:

a),先把第一项[6]取出来,

用[6]依次与其余项进行比较:

如果比[6]小就放[6]前边,2 4 1 5都比[6]小,所以全部放到[6]前边;

如果比[6]大就放[6]后边,9比[6]大,放到[6]后边;

一趟排完后变成下边这样:

排序前62 4 1 5 9

排序后 2 4 1 569

b),对前半边[2 4 1 5]继续进行快速排序

重复步骤a)后变成下边这样:

排序前24 1 5

排序后 124 5

前半边排序完成,总的排序也完成:

排序前:[6 2 4 1 5 9]

排序后:[1 2 4 5 6 9]

排序结束

代码

将前后分开函数:

int partition(int unsorted[], int low, int high)

{

int pivot = unsorted[low];

while(low < high)

{

while((low < high) && (unsorted[high] >= pivot))

--high;

unsorted[low] = unsorted[high];

while((low < high) && (unsorted[low] <= pivot))

++low;

unsorted[high] = unsorted[low];

}

unsorted[low] = pivot;

return low;

}

快速排序函数:

void quickSort(int unsorted[], int low, int high)

{

int loc = 0;

if(low < high)

{

loc = partition(unsorted, low, high);

quickSort(unsorted, low, loc -1);

quickSort(unsorted, loc + 1, high);

}

}

举例测试:

void Main(void)

{

int i;

int a[6] = {6, 2, 4, 1, 5, 9};

quickSort(a, 0, 5);

for(i=0; i<6; i++)

printf("a[%d] = a[%d]\n", i, a[i]);

}

在排序算法中,这两种是较重要的排序算法,其他算法在特定场合也有用武之地,本文暂时讲述到这里。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • adc
    adc
    +关注

    关注

    100

    文章

    7392

    浏览量

    553782
  • 排序
    +关注

    关注

    0

    文章

    32

    浏览量

    9946
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    拼多多商品列表API使用指南

    商品。 分类筛选:按商品类目进行筛选。 价格排序:按商品价格进行升序或降序排列。 销量排序:按商品销量进行排序。 分页查询:支持大数据量的分页获取。 2.公共请求地址:c0b.cc/R4rbK2 。 二、Python请求示例 以
    的头像 发表于 11-29 15:17 389次阅读

    C语言的常见算法

    # C语言常见算法 C语言中常用的算法可以分为以下几大类: ## 1. 排序算法 ### 冒泡排序 (Bubble Sort) ```
    发表于 11-24 08:29

    1688 拍立淘接口实战:从图像优化、工厂排序到供应链匹配(附可跑代码)

    深耕B2B电商十余年,亲历1688拍立淘接口20+坑:从图像预处理、权限申请到工厂排序。本文详解核心参数、实战代码及多图验证、定制方案生成等高级技巧,助你实现“看图找厂”精准匹配,附可运行代码,新手也能少走两年弯路。
    的头像 发表于 10-09 10:39 290次阅读

    Microchip EV28J28A超声波电源评估板技术解析与应用指南

    Microchip Technology EV28J28A 超声波电源评估板具有超声波脉冲发生器和多路复用器演示所需的所有电压轨。该评估板提供电源排序和故障保护。EV28J28A评估板还支持外部同步。该板可自动处理脉冲发生器演示板所需的上电和掉电排序
    的头像 发表于 10-06 16:07 1024次阅读
    Microchip EV28J28A超声波电源评估板技术解析与应用指南

    使用env工具 生成的mdk工程 中的 头文件路径太乱了怎么解决?

    能不能按照相似路径归类排序
    发表于 09-16 07:46

    分享一个嵌入式学习阶段规划

    (如指针实现链表增删查改),排查内存泄漏、野指针数据结构与算法:掌握线性表 / 栈 / 树等结构,学查找 / 排序算法,手写代码(如二分查找、快速排序)电子电路基础:学电路原理、电子元
    发表于 09-12 15:11

    Texas Instruments TPS743低压差 (LDO) 线性稳压器数据手册

    和内核引脚之间ESD结构的应力。借助电源良好输出和使能输入,可使用外部稳压器轻松实现排序。借助这种灵活性,用户可以配置解决方案,满足DSP、FPGA和其他具有特殊启动要求的应用的排序要求。
    的头像 发表于 07-04 15:41 822次阅读
    Texas Instruments TPS743低压差 (LDO) 线性稳压器数据手册

    国际首创新突破!中国团队以存算一体排序架构攻克智能硬件加速难题

    2025 年 6 月 25 日,北京大学团队在智能计算硬件方面取得领先突破,国际上首次实现了基于存算一体技术的高效排序硬件架构 (A fast and reconfigurable
    的头像 发表于 07-02 16:50 544次阅读
    国际首创新突破!中国团队以存算一体<b class='flag-5'>排序</b>架构攻克智能硬件加速难题

    Analog Devices Inc. MAX16895 监控电路特性/应用/功能图

    Analog Devices MAX16895监控电路是小型、低功耗、电压监控电路,具有排序功能。这些器件具有可调的、低至0.5V的电压监控阈值,并可利用外部电容调节延迟时间。这些Analog Devices器件非常适合用于电源排序、复位
    的头像 发表于 06-26 09:34 548次阅读
    Analog Devices Inc. MAX16895 监控电路特性/应用/功能图

    双电机同步驱动系统控制参数整定研究

    对系统进行建模后,首先采用传统遗传算法,对多通道多控制器系统的控制器参数进行整定;然后从系统整体性能的角度出发,利用带精英策略的非支配排序遗传算法对系统控制器参数进行多目标整定。仿真结果表明:采用双通道
    发表于 06-19 11:04

    低成本电源排序器解决方案

    绝大多数负载点DC-DC转换器可以将上一个转换器的电源就绪输出连接至下一个转换器的使能输入,实现上电排序。这种方法只适合比较简单的设计,不能满足多数现代微处理器和DSP的要求一这类器件要求断电顺序必须与上电顺序相反。许多厂商针对这类应用推出了可编程排序IC,但器件价格较为
    的头像 发表于 05-21 09:55 961次阅读
    低成本电源<b class='flag-5'>排序</b>器解决方案

    UCD9224 2 MHz、2 轨、4 相数字 PWM 降压控制器,具有改进的排序功能技术资料

    和管理。 UCD9224 旨在为非隔离式 DC/DC 转换器应用提供各种理想的功能,同时通过减少外部电路来最大限度地减少系统组件总数。该解决方案将多回路管理与排序、裕度、跟踪和智能相位管理集成在一起,以优化整体系统效率。此外,还支持环路补偿和校准,无需添加外部元件。
    的头像 发表于 03-28 15:44 564次阅读
    UCD9224 2 MHz、2 轨、4 相数字 PWM 降压控制器,具有改进的<b class='flag-5'>排序</b>功能技术资料

    TPS74701-Q1 具有电源正常功能的汽车类 500mA、低 VIN (0.8V)、可调超低压差稳压器数据手册

    型的处理器和 ASIC 供电而设计。使能输入和电源就绪输出允许使用外部稳压器轻松排序,从而允许配置满足具有特殊启动要求的广泛应用的排序要求的解决方案。
    的头像 发表于 03-06 14:46 866次阅读
    TPS74701-Q1 具有电源正常功能的汽车类 500mA、低 VIN (0.8V)、可调超低压差稳压器数据手册

    详解Linux sort命令之掌握排序技巧与实用案例

    在linux系统使用过程中,提供了sort排序命令,支持常用的排序功能。 常用参数 sort命令支持很多参数,常用参数如下:   短参数 长参数 说明 -n – number-sort 按字符串数值
    的头像 发表于 01-09 10:10 1581次阅读

    TimSort:一个在标准函数库中广泛使用的排序算法

    在计算机科学的领域,排序算法是每位学生必学的基础,而排序的需求是每位程序员在编程过程中都会遇到的。 在你轻松调用 .sort() 方法对数据进行排序时,是否曾好奇过,这个简单的方法背后
    的头像 发表于 01-03 11:42 953次阅读