【转载】[经验] 嵌入式stm32实用的排序算法 - 交换排序
| Ⅰ、写在前面
前面写了关于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) { pos = 0; for(j=0; j<i; 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<high; ++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]<r[j-1]) { 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]后边; 一趟排完后变成下边这样: 排序前 6 2 4 1 5 9 排序后 2 4 1 5 6 9 b),对前半边[2 4 1 5]继续进行快速排序 重复步骤a)后变成下边这样: 排序前 2 4 1 5 排序后 1 2 4 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); } |
原文链接:http://bbs.elecfans.com/jishu_1569699_1_1.html
【转载】[经验] 嵌入式stm32实用的排序算法 - 交换排序的更多相关文章
- js实现两种实用的排序算法——冒泡、快速排序
分类:js (4443) (0) 零:数据准备,给定数组arr=[2,5,4,1,7,3,8,6,9,0]; 一:冒牌排序 1思想:冒泡排序思想:每一次对比相邻两个数据的大小,小的排在前面,如果前 ...
- 【转载】常见十大经典排序算法及C语言实现【附动图图解】
原文链接:https://www.cnblogs.com/onepixel/p/7674659.html 注意: 原文中的算法实现都是基于JS,本文全部修改为C实现,并且统一排序接口,另外增加了一些描 ...
- java排序算法-交换排序
public class ExchangeSortUtils { // 冒泡 public static void bubbleSort(int[] array) { int length = arr ...
- 排序算法——交换排序(冒泡排序、快速排序)(java)
一.冒泡排序 时间复杂度:O(n^2) 公认最慢的排序,每次把最大/最小的放一边,原理: [57,68,59,52] [57,68,59,52] [57,59,68,52] [57,59,52,68] ...
- Java排序 - 不实用的几个排序算法 -- 睡眠排序、猴子排序、面条排序、珠排序
介绍几个不实用的排序算法,一来可以在学习时增加一些乐趣,放松一下自己,二来可以学习一下.思考一下这些算法失败在哪里,又是否存在一些好的地方? 睡眠排序 这是一个思想比较简单,脑洞巨大的算法 -- 我们 ...
- Stooge排序与Bogo排序算法
本文地址:http://www.cnblogs.com/archimedes/p/stooge-bogo-sort-algorithm.html,转载请注明源地址. Stooge排序算法 Stooge ...
- 排序算法 2 qsort 库函数,泛型函数
_____谈谈排序算法 交换排序——>冒泡排序-->快速排序 选择排序——>简单选择排序——>堆排序 插入排序——>直接插入排序——>希尔排序 _____排序算法对 ...
- 排序算法 ----(转载::http://blog.csdn.net/hguisu/article/details/7776068)
1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第1个记录看成是一个有序 ...
- 转载部长一篇大作:常用排序算法之JavaScript实现
转载部长一篇大作:常用排序算法之JavaScript实现 注:本文是转载实验室同门王部长的大作,找实习找工作在即,本文颇有用处!原文出处:http://www.cnblogs.com/ywang172 ...
随机推荐
- Springboot 整合通用mapper和pagehelper展示分页数据(附github源码)
简介 springboot 设计目的就是为了加速开发,减少xml的配置.如果你不想写配置文件只需要在配置文件添加相对应的配置就能快速的启动的程序. 通用mapp 通用mapper只支持对单表的操作,对 ...
- Vuex的同步异步存值取值
1. vue中各个组件之间传值 1.父子组件 父组件-->子组件,通过子组件的自定义属性:props 子组件-->父组件,通过自定义事件:this.$emit('事件名',参数1,参数2, ...
- zset类型数据的操作指令
1. 也可以追加数据 2. 3. 4. 5. 6. 7. 8. 9.
- VS dll 引用依赖
在公司实习过程中,经常遇到三个问题: 开发环境 dll引用依赖 dll版本控制 一般公司都会配置开发/测试/Lab/线上四个环境,之后不管时开发什么项目,都与环境分不开边.这个和dll版本控制暂且记下 ...
- 20210811 Dove 打扑克,Cicada 与排序,Cicada 拿衣服
考场 开考感觉 T3 比较可做.T1 看上去不难但毫无思路. 先想了 25min T3,想到一个确定左端点,二分最长的右端点,甚至想到了用猫树维护区间 or and...上厕所回来发现假了,没有单调性 ...
- java 集合特性面试必备
collection 集合体系 数据结构栈和队列栈结构 :先进后出队列结构 :先进先出 数据结构之数组和链表数组结构:查询快.增删慢队列结构 :查询慢.增删快 List集合概述有序集合(也称为序列), ...
- 快速模式第一包: quick_outI1()
文章目录 1. 序言 2. quick_outI1()流程图 3. quick_outI1()源码分析 4. quick_outI1_continue()源码分析 5. quick_outI1_tai ...
- 10分钟学会VS NuGet包私有化部署
前言 我们之前实现了打包发布NuGet,但是发布后的引用是公有的,谁都可以访问,显然这种方式是不可取的. 命令版本:10分钟学会Visual Studio将自己创建的类库打包到NuGet进行引用(ne ...
- JS005. 拷贝引用数据类型Array使其指向不同堆的解决方案
一个很常见的语法问题,但专注实现需求时经常会忘记去避免,导致最终问题的出现,再花时间排查.为此专门整理一篇解决方法的博客,也加强一下自己的记忆. TAG: JSON.parse() JSON.stri ...
- js实现钟表
在网页上显示一个钟表 html: <body onload="startTime()"> <div id="txt"></div& ...