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

对冒泡算法的优化

[复制链接]
haocheng996 发布时间:2019-5-24 16:57
本人参考网上对冒泡算法的优化,再一次进行的小小优化,欢迎各位指点
* Y0 x- T' Z) ^6 L7 i( a0 S& j
9 N7 S7 t; Q2 F9 h1 i; I$ S
  1. void bubble4(uint16_t *arr, uint16_t length)
    3 E4 n0 R* u( ]: L' O4 ?3 O
  2. {
    5 L- b, w0 U& Z6 R9 E
  3.         uint16_t borden_right = length -1; //右边界初始值
    9 A1 f0 V6 @" X3 f" h; e, U! @2 Z
  4.         uint16_t borden_left  = 0;         //左边界初始值为, _7 N3 W3 r% I9 X5 T9 p- R' t
  5.         uint16_t lastPos      = 0;         //记录右边界的值
    ) _+ F$ @' U  I9 {
  6.         uint16_t prePos       = 0;         //记录左边界的值# s% M5 v6 I, G& x' |
  7.     uint16_t temp;                     //交换的中间变量- r1 h4 Z# j7 ]! g3 B" J4 g/ S
  8.         uint8_t  flag, i, j;               //是否有交换的标志     
    / M8 N/ r+ }9 P4 V
  9.     $ V* o2 d$ G4 o9 k3 {/ R$ H1 N
  10.     7 `0 J* U' n* k' V! a& Z' M5 @6 n- C$ ]
  11.         for(i = 0; i < length-1; i++)
    3 ?  `% I$ [9 |7 q2 \
  12.     {- k; C7 z2 d& v
  13.                 flag = 1;& m. K# b( ^- n
  14. / P# l# J7 }2 x1 Z4 c
  15.                 //正向找出最大值. M' B/ ^5 i$ b6 [1 Q! ?5 g7 ^
  16.                 for( j = borden_left; j < borden_right; j++)
    % ?' j  `# {* {
  17.         {
    : M& B" K$ R' @) `, A% @
  18.                         if(arr[j] > arr[j+1]) * G; @6 e2 E& ]% o$ {
  19.             {. Z$ ^/ A) m5 |& J- _7 u
  20.                 temp     = arr[j];# U/ |1 i2 q4 F5 |
  21.                 arr[j]   = arr[j+1];7 ^8 q" [: Q+ c: f) L
  22.                 arr[j+1] = temp;+ ]$ g4 y7 c( E% ~! {0 z9 q
  23.                                 flag = 0;
    ' j5 X) {: [8 d+ l
  24.                                 lastPos = j;' `5 }$ s" _* g6 w' E# _- s" Z3 v
  25.                         }
    & F7 C  F7 |' U2 G4 S# d  u
  26.                 }
    2 V7 s; |, u% _$ n8 E4 ?
  27.         
    3 B4 d/ v: k  e0 b4 \7 ~
  28.         //正向没发生交换就证明数组已经排好了& O0 S4 B* L2 o/ b; Z/ C5 s) l
  29.         if(flag)
    + [7 r, ~9 m& D/ E7 Y
  30.         {) j( A- b) L2 R
  31.             break;4 Y; D7 ]3 S/ g$ e& C4 [; W; B" S% q
  32.         }3 E0 K# `% E2 p  l3 d
  33.         
      S- b. W1 `9 J0 d  Y8 @% q
  34.         borden_right = lastPos;
    / y, o$ g0 q& i1 Y: t
  35.    
    $ K2 j$ ~8 F/ X/ ^1 H6 T: A! @2 G
  36.                 //逆向找出最小值
    ) f( `2 k0 c( ]# D: \' S" M
  37.                 for( j = borden_right; j > borden_left; j--)
    + X: r% }' m5 q
  38.         {% T6 p8 @1 T+ |9 ], }
  39.                         if(arr[j] < arr[j-1])
    ! b; B  g0 Q1 M
  40.             {. r6 t6 @6 [6 B) j2 O9 Z
  41.                 temp     = arr[j];
    ) }6 [  q# z0 Z2 R3 O8 ~, [
  42.                 arr[j]   = arr[j-1];
    2 }8 N6 E9 b$ c9 i
  43.                 arr[j-1] = temp;1 }3 [, z6 L' O, y* O
  44.                                 flag = 0;7 s- N2 i. \- q/ u- L/ Y# z+ x
  45.                                 prePos = j;
    5 h" }, i* k/ H) C8 H, }6 h
  46.                         }, {" b9 |3 B9 i  s) c+ Z3 i4 X
  47.                 }* F+ A0 _+ u: ^; j0 m0 {1 d
  48. ; m* A) c. N; V. |8 {. w: ]5 S
  49.                 if(flag) 9 ]# s( T( O/ k1 K$ n
  50.         {
    , q3 Q) n5 F9 C
  51.                         break;# n1 a2 C9 `' m) k8 S8 s
  52.                 }
    7 L/ S! A, e+ }0 S! P, G
  53.         5 L) j, H( r8 _9 _1 a8 o
  54.                 borden_left  = prePos;9 H0 U9 y7 w4 O& G/ W. h( E8 g2 K
  55.         6 }5 N  y8 L4 H: @& O
  56.         //每排序一次都把数组打印出来: c" a0 H( e: O0 a* K
  57. //        for(j = 0; j < length; j++): h! I& a1 X+ Z7 o- J& l
  58. //        {
    # F. z# {( P. T
  59. //            USART_SendData(USART1, arr[j]);
    ! g0 n1 ~9 T6 W2 ?" J3 O2 k8 l; D
  60. //            while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);, M7 j3 h9 P- ]
  61. //        }: L! a: e: r. I1 [3 |+ a
  62.         }
    . I3 m$ Q$ k9 `+ H5 Q7 P
  63. & @1 B7 Q3 ?& [" F! W# U; `
  64. }
复制代码

8 _; H7 G3 ^7 B6 \" w* s! d3 v" S1 w3 j
2 U; \) X2 O/ ~
收藏 1 评论6 发布时间:2019-5-24 16:57

举报

6个回答
STM1024 回答时间:2019-5-25 17:58:03
从时间复杂度上,你比原始的冒泡法系数还大一些?
奏奏奏 回答时间:2019-5-25 19:19:43
我觉得所谓优化,应该是有明确的对比参数数据的,比如执行时间消耗短了,占用RAM变小了……等等
# {' T& d& v5 o4 U如果楼主能提供这些数据,我觉得更好
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 手机版