你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

对冒泡算法的优化

[复制链接]
haocheng996 发布时间:2019-5-24 16:57
本人参考网上对冒泡算法的优化,再一次进行的小小优化,欢迎各位指点

  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. }
复制代码



收藏 1 评论6 发布时间:2019-5-24 16:57

举报

6个回答
STM1024 回答时间:2019-5-25 17:58:03
从时间复杂度上,你比原始的冒泡法系数还大一些?
奏奏奏 回答时间:2019-5-25 19:19:43
我觉得所谓优化,应该是有明确的对比参数数据的,比如执行时间消耗短了,占用RAM变小了……等等
如果楼主能提供这些数据,我觉得更好
jyl_518 回答时间:2019-5-26 10:17:47
直接上选择法吧
haocheng996 回答时间:2019-5-28 16:04:49
时间上会节省,但栈空间就要付出多一点,个人兴趣,实验数据就不发出来了
天臆弄人 回答时间:2019-5-28 17:12:55
你这没看出哪有优化,在网上看到过相似的算法, 你这改过的程序,CPU执行的过程,比你不改更花时间,除非是运算的百W级别数组
天臆弄人 回答时间:2019-5-28 17:14:16
你有没有测试过具体时间呢,比较下常规的和你改过在 1000个数组排列,耗时大小

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版