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

对冒泡算法的优化

[复制链接]
haocheng996 发布时间:2019-5-24 16:57
本人参考网上对冒泡算法的优化,再一次进行的小小优化,欢迎各位指点
( Q7 T* l. l# w/ E9 r1 X; E/ R9 b, \
  1. void bubble4(uint16_t *arr, uint16_t length) ; S1 E: w) ^5 T' ]
  2. {
    ) b! X% q  N" A. j1 Q8 \' f3 Z; ~- ^
  3.         uint16_t borden_right = length -1; //右边界初始值- [8 C) ~0 @4 E3 v6 G. e
  4.         uint16_t borden_left  = 0;         //左边界初始值为# u$ ^: F0 d3 W. L4 M( `
  5.         uint16_t lastPos      = 0;         //记录右边界的值
    % y# x, m& X9 G
  6.         uint16_t prePos       = 0;         //记录左边界的值
    * a7 [% e1 j8 K* M/ g! ~$ Z, E
  7.     uint16_t temp;                     //交换的中间变量
    * t! S  p% E8 X* A: u3 G! P
  8.         uint8_t  flag, i, j;               //是否有交换的标志     ! F! |9 j6 ^" n/ K6 x5 Q% q$ ]( w. T
  9.     3 O6 e9 L* H" y* Z3 n- m
  10.    
    + z" G$ }5 ]' _. M+ \
  11.         for(i = 0; i < length-1; i++)
    / W' b! R/ a( L2 r" p
  12.     {
    + o# W) D2 s3 J& [  N: o8 G* q
  13.                 flag = 1;; v0 r) G( e; i

  14. 9 o$ o) a' W  j0 c: |
  15.                 //正向找出最大值
    $ ~4 l9 v) ~# J. {( [& e- \
  16.                 for( j = borden_left; j < borden_right; j++)
    & X) P! j, y# r% a/ [: }
  17.         {+ T! b. v% G0 _6 f
  18.                         if(arr[j] > arr[j+1])
    / X0 N! Y8 S2 X. L, e% U
  19.             {3 c1 F. z9 C7 m- ~  h+ G
  20.                 temp     = arr[j];: A* Y& w, @- E0 R! a6 }% ]( X  q5 d
  21.                 arr[j]   = arr[j+1];
    " `7 g# k* o2 ~1 j* l0 i* @  L( |
  22.                 arr[j+1] = temp;
    & F" l3 T% R9 S
  23.                                 flag = 0;2 s6 b+ ]& `, ]
  24.                                 lastPos = j;4 ]2 @3 W5 ^' f. {5 F& p6 e
  25.                         }+ J- {* _+ v- j
  26.                 }7 J+ m) z$ h7 F" F, I
  27.         
    * q- y8 T% }( f* e
  28.         //正向没发生交换就证明数组已经排好了
    % {2 d% t, r5 ]+ E, @5 l2 C( Y$ ~
  29.         if(flag)
    , f& n& ]+ j- k) T: E
  30.         {; v, H$ k7 H0 G; ?0 @' M" y
  31.             break;3 N* i) i+ @( E$ X* ^
  32.         }
    * `6 y- Q/ ?( Y7 P5 d
  33.         0 e8 g+ X8 X6 y
  34.         borden_right = lastPos;
    6 a2 s: g0 l1 f! u& \
  35.    
    ; L( u  c8 W: I( h
  36.                 //逆向找出最小值- u4 p! l/ [5 d! l
  37.                 for( j = borden_right; j > borden_left; j--)
    2 @* b" h6 R8 ^. I
  38.         {
    + r, i% m# {- N, G
  39.                         if(arr[j] < arr[j-1])
    & @2 Y6 d9 c6 Q
  40.             {
    & \9 l' K1 H$ b# v5 x% M
  41.                 temp     = arr[j];
    - `  `# |, w; C$ A
  42.                 arr[j]   = arr[j-1];
    ! y/ @: A7 n4 W) H
  43.                 arr[j-1] = temp;5 U) l! e+ k. b  g
  44.                                 flag = 0;, Y6 |- x, g1 ~2 P; m8 P/ p6 F
  45.                                 prePos = j;" `  u% I# r3 v2 `
  46.                         }
    ! K$ P  H1 Q4 v) c% `( t
  47.                 }# S0 f, c  `  H/ {# |

  48. 3 n. H8 o4 k! c7 f; s
  49.                 if(flag) 0 C; E$ P+ J, ^3 V; J5 I
  50.         {+ Y3 k, L$ N0 M
  51.                         break;5 j+ m! ^* I+ S' `' x, ~
  52.                 }
    9 E6 _# N( A) N9 G
  53.        
      U0 I/ N2 g/ C7 f* P
  54.                 borden_left  = prePos;
    / r# W, D" g+ E5 K1 u! K" `
  55.         $ d/ \" ?0 i9 c2 X
  56.         //每排序一次都把数组打印出来3 U2 E$ h5 l/ ^. P7 f& u
  57. //        for(j = 0; j < length; j++)
    + _: y5 `% l, b. r6 c+ J- J- u
  58. //        {
    ' n9 R1 `8 B$ ?0 q- j
  59. //            USART_SendData(USART1, arr[j]);6 o" |9 k9 C. ^1 P$ |- x* v- E# ~
  60. //            while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);( [3 _: I( ~4 }; f% _
  61. //        }0 E& Q$ z- V0 t; h1 ]% c0 _
  62.         }
    4 ?5 {+ N$ C. w1 W* n5 o
  63. & U$ y. ^1 r: ^% I
  64. }
复制代码
3 C/ M! s. g* ?  @
/ m, o: [1 D; R& J" k
- K, x" n6 E1 ~- Y3 s
收藏 1 评论6 发布时间:2019-5-24 16:57

举报

6个回答
STM1024 回答时间:2019-5-25 17:58:03
从时间复杂度上,你比原始的冒泡法系数还大一些?
奏奏奏 回答时间:2019-5-25 19:19:43
我觉得所谓优化,应该是有明确的对比参数数据的,比如执行时间消耗短了,占用RAM变小了……等等
" T1 ?0 p. V0 g% S  W& r如果楼主能提供这些数据,我觉得更好
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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版