冒泡排序优化

ADC采集的数据一般都要有所处理,或是取平均值,或是取中间值,我一般都是排序后取中间值。最常用的是冒泡排序,代码容易理解,容易编写。用了多年才发现还有个地方可以优化一下,或许能减少运算次数,也就提高了效率。发文章来巩固一下。个人水平有限,如有错误,还请指正mr.li.ming@qq.com。

原理:按顺序比较两个数的大小,如果前面的比后面的大,就交换一下位置。

借鉴一张动图易于理解

一般代码

 1 void BubbleSort1(unsigned char *Buffer, unsigned char Len)
 2 {
 3     unsigned char temp;
 4     unsigned char i,j;
 5 
 6     for (i = 0; i < (Len-1); ++i)
 7     {
 8         for (j = 0; j < (Len-1-i); ++j)
 9         {
10             if (Buffer[j]>Buffer[j+1])
11             {
12                 temp = Buffer[j];
13                 Buffer[j] = Buffer[j+1];
14                 Buffer[j+1] = temp;
15             }
16         }
17 } 18 }

排这么一个数组

unsigned char DatTab[10]={0x02,0x03,0x06,0x01,0x09,0x08,0x0A,0X05,0x07,0x04};

过程

02 03 01 06 08 09 05 07 04 0a //第1次排序后
02 01 03 06 08 05 07 04 09 0a //第2次排序后
01 02 03 06 05 07 04 08 09 0a //第3次排序后
01 02 03 05 06 04 07 08 09 0a //第4次排序后
01 02 03 05 04 06 07 08 09 0a //第5次排序后
01 02 03 04 05 06 07 08 09 0a //第6次排序后
01 02 03 04 05 06 07 08 09 0a //第7次排序后
01 02 03 04 05 06 07 08 09 0a //第8次排序后
01 02 03 04 05 06 07 08 09 0a //第9次排序后
可以看出实际上在第6次排序后就已经全部排好了
 
 1 void BubbleSort(unsigned char *Buffer, unsigned char Len)
 2 {
 3     unsigned char temp;
 4     unsigned char i,j,flag;
 5 
 6     for (i = 0; i < (Len-1); ++i)
 7     {
 8         flag = 1;
 9         for (j = 0; j < (Len-1-i); ++j)
10         {
11             if (Buffer[j]>Buffer[j+1])
12             {
13                 temp = Buffer[j];
14                 Buffer[j] = Buffer[j+1];
15                 Buffer[j+1] = temp;
16                 flag = 0;
17             }
18         }
19         if (flag)break;
20     }
21 }

同样排一个数组

过程

02 03 01 06 08 09 05 07 04 0a //第1次排序后
02 01 03 06 08 05 07 04 09 0a //第2次排序后
01 02 03 06 05 07 04 08 09 0a //第3次排序后
01 02 03 05 06 04 07 08 09 0a //第4次排序后
01 02 03 05 04 06 07 08 09 0a //第5次排序后
01 02 03 04 05 06 07 08 09 0a //第6次排序后
01 02 03 04 05 06 07 08 09 0a //第7次排序后
只进行了7次,第6次排序后已经排好了,第7次排序过程中没有数据交换,说明已经排序完成了,就终止了循环。
 
原文地址:https://www.cnblogs.com/IdeaMing/p/10895352.html