冒泡排序优化
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次排序过程中没有数据交换,说明已经排序完成了,就终止了循环。