zoukankan      html  css  js  c++  java
  • 冒泡排序优化

    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次排序过程中没有数据交换,说明已经排序完成了,就终止了循环。
     
  • 相关阅读:
    jQuery文档处理--事件--动画
    jQuery选择器
    jQuery入门
    正则表达式
    Bootstrap 的基本实现
    JavaScript--DOM
    JavaScript--BOM
    JavaScript--ECMAScript
    CSS3动画
    CSS3新增的选择器
  • 原文地址:https://www.cnblogs.com/IdeaMing/p/10895352.html
Copyright © 2011-2022 走看看