搜索
查看: 795|回复: 6

[分享] 对冒泡算法的优化

[复制链接]

该用户从未签到

5

主题

96

帖子

7

蝴蝶豆

高级会员

最后登录
2021-3-30
发表于 2019-5-24 16:57:44 | 显示全部楼层 |阅读模式
本人参考网上对冒泡算法的优化,再一次进行的小小优化,欢迎各位指点

  1. void bubble4(uint16_t *arr, uint16_t length)
  2. {
  3.         uint16_t borden_right = length -1; //右边界初始值
  4.         uint16_t borden_left  = 0;         //左边界初始值为
  5.         uint16_t lastPos      = 0;         //记录右边界的值
  6.         uint16_t prePos       = 0;         //记录左边界的值
  7.     uint16_t temp;                     //交换的中间变量
  8.         uint8_t  flag, i, j;               //是否有交换的标志     
  9.    
  10.    
  11.         for(i = 0; i < length-1; i++)
  12.     {
  13.                 flag = 1;

  14.                 //正向找出最大值
  15.                 for( j = borden_left; j < borden_right; j++)
  16.         {
  17.                         if(arr[j] > arr[j+1])
  18.             {
  19.                 temp     = arr[j];
  20.                 arr[j]   = arr[j+1];
  21.                 arr[j+1] = temp;
  22.                                 flag = 0;
  23.                                 lastPos = j;
  24.                         }
  25.                 }
  26.         
  27.         //正向没发生交换就证明数组已经排好了
  28.         if(flag)
  29.         {
  30.             break;
  31.         }
  32.         
  33.         borden_right = lastPos;
  34.    
  35.                 //逆向找出最小值
  36.                 for( j = borden_right; j > borden_left; j--)
  37.         {
  38.                         if(arr[j] < arr[j-1])
  39.             {
  40.                 temp     = arr[j];
  41.                 arr[j]   = arr[j-1];
  42.                 arr[j-1] = temp;
  43.                                 flag = 0;
  44.                                 prePos = j;
  45.                         }
  46.                 }

  47.                 if(flag)
  48.         {
  49.                         break;
  50.                 }
  51.        
  52.                 borden_left  = prePos;
  53.         
  54.         //每排序一次都把数组打印出来
  55. //        for(j = 0; j < length; j++)
  56. //        {
  57. //            USART_SendData(USART1, arr[j]);
  58. //            while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  59. //        }
  60.         }

  61. }
复制代码



回复

使用道具 举报

  • TA的每日心情
    奋斗
    2021-4-15 11:47
  • 签到天数: 537 天

    [LV.9]

    29

    主题

    2176

    帖子

    127

    蝴蝶豆

    论坛元老

    最后登录
    2023-8-27
    发表于 2019-5-25 17:58:03 | 显示全部楼层
    从时间复杂度上,你比原始的冒泡法系数还大一些?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    54

    主题

    499

    帖子

    152

    蝴蝶豆

    论坛元老

    最后登录
    2021-3-29
    发表于 2019-5-25 19:19:43 | 显示全部楼层
    我觉得所谓优化,应该是有明确的对比参数数据的,比如执行时间消耗短了,占用RAM变小了……等等
    如果楼主能提供这些数据,我觉得更好
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    22

    主题

    563

    帖子

    41

    蝴蝶豆

    金牌会员

    最后登录
    2023-9-24
    发表于 2019-5-26 10:17:47 | 显示全部楼层
    直接上选择法吧
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    5

    主题

    96

    帖子

    7

    蝴蝶豆

    高级会员

    最后登录
    2021-3-30
     楼主| 发表于 2019-5-28 16:04:49 | 显示全部楼层
    时间上会节省,但栈空间就要付出多一点,个人兴趣,实验数据就不发出来了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10

    主题

    195

    帖子

    65

    蝴蝶豆

    金牌会员

    最后登录
    2023-9-26
    发表于 2019-5-28 17:12:55 | 显示全部楼层
    你这没看出哪有优化,在网上看到过相似的算法, 你这改过的程序,CPU执行的过程,比你不改更花时间,除非是运算的百W级别数组
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10

    主题

    195

    帖子

    65

    蝴蝶豆

    金牌会员

    最后登录
    2023-9-26
    发表于 2019-5-28 17:14:16 | 显示全部楼层
    你有没有测试过具体时间呢,比较下常规的和你改过在 1000个数组排列,耗时大小
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

    GMT+8, 2024-4-19 20:03 , Processed in 0.169490 second(s), 35 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表