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

对冒泡算法的优化

[复制链接]
haocheng996 发布时间:2019-5-24 16:57
本人参考网上对冒泡算法的优化,再一次进行的小小优化,欢迎各位指点5 T, p& D* v5 d$ I7 U+ U$ X$ N
% }* i0 c, m! f3 E
  1. void bubble4(uint16_t *arr, uint16_t length) " o4 |% w# K0 O& }
  2. {( e8 D3 G8 S1 z. ?2 v, j- D( F
  3.         uint16_t borden_right = length -1; //右边界初始值
    8 D. b& s8 ~, A8 J' y, ?  K
  4.         uint16_t borden_left  = 0;         //左边界初始值为
    ) u2 e$ }9 }9 J1 H, q% @
  5.         uint16_t lastPos      = 0;         //记录右边界的值
    ' m/ n( j/ b4 }1 J, e5 o
  6.         uint16_t prePos       = 0;         //记录左边界的值8 }- C  B! E# f* ]+ E
  7.     uint16_t temp;                     //交换的中间变量9 K. d4 R; l6 h/ Z% X
  8.         uint8_t  flag, i, j;               //是否有交换的标志     0 T( F, o5 J( Q" m; n
  9.     1 u7 w# S& x: c. Z
  10.     & n" i' ^3 ~' ?8 g
  11.         for(i = 0; i < length-1; i++) ( U$ _- d. B0 P/ a, s6 Z# z! N
  12.     {
    4 a" `: B5 Z2 ~) |6 I4 P
  13.                 flag = 1;7 @% b7 S" E  g, T
  14. ; |) u2 K$ X. ]) k, a5 r3 i
  15.                 //正向找出最大值% }3 C2 T% ?$ I; N& L; U
  16.                 for( j = borden_left; j < borden_right; j++)3 u6 c# H' c0 r8 n+ q
  17.         {
    ( R6 N! A0 x4 |) _
  18.                         if(arr[j] > arr[j+1])   w2 Y# h; S! H7 I7 g- q* R
  19.             {" s: h' r- }6 l5 {- ^/ ~6 X
  20.                 temp     = arr[j];
    6 _- g$ k# r! W. y: l8 \# {
  21.                 arr[j]   = arr[j+1];
    % U' d! i% j' o/ V' |
  22.                 arr[j+1] = temp;: P+ e- X: Z4 ?4 {1 ]
  23.                                 flag = 0;
    - f4 N  e9 N: W. s
  24.                                 lastPos = j;
    1 c% u) ~9 U2 l2 U7 I+ k
  25.                         }5 P! g+ x9 R& O
  26.                 }
    $ c9 E; z2 ^4 E/ d2 h/ j6 m9 R
  27.         
    + K4 Y# n, z$ F/ K
  28.         //正向没发生交换就证明数组已经排好了! I' l+ z7 c7 d) L6 \
  29.         if(flag), ]! O" J, W+ \5 c7 L
  30.         {
    ! _* o! ^* d$ j8 X$ B+ U& A
  31.             break;) e* W5 E* d8 U1 C5 C  ?6 R/ Y
  32.         }
    ) Y. e) T3 Q% J3 ]& e2 K$ R
  33.         
    9 \; J. n, `! i6 R0 G
  34.         borden_right = lastPos;2 X1 h1 W5 u9 x+ n# s
  35.    
    & f- e/ H% {* f
  36.                 //逆向找出最小值
    ' E: F2 k, h3 O$ X
  37.                 for( j = borden_right; j > borden_left; j--)
    " v0 V* i' x8 q" ?- m3 b
  38.         {
    " B: p* Y4 h& e; e, E& }- e6 K& i# m
  39.                         if(arr[j] < arr[j-1])
    5 m! H0 d1 S  n) e3 B  P& c+ ?$ r
  40.             {
    & P5 e) \, S+ A' M8 Y  l
  41.                 temp     = arr[j];
    & d4 o' `7 L8 E+ w: o
  42.                 arr[j]   = arr[j-1];
    ; o9 W6 f' e1 m, Z; Z- s
  43.                 arr[j-1] = temp;6 b% x; Z" G( R  u/ L" K) z( b+ R
  44.                                 flag = 0;; a. Z; ~/ \6 S/ n# E: S6 k
  45.                                 prePos = j;- z: e( j- ]/ i* }( u
  46.                         }
    " E$ m$ {* Z4 [+ a9 ~
  47.                 }
    6 Y  x6 U' e% n8 B+ t6 f

  48.   A) `6 z5 D- P; T4 P2 k
  49.                 if(flag) 4 Y! c3 f) I- v8 b) y) [. _: F$ h
  50.         {
    , F6 H6 t  K* z+ {$ H  R
  51.                         break;6 c6 [  W! B0 I
  52.                 }
    3 f( R8 A# ]: d- d- ?5 Z
  53.         : O# [, @: U5 M) F" Q: r- H4 e, [
  54.                 borden_left  = prePos;
    : c0 ^+ _1 S1 K; p3 p, W+ K6 {+ D9 Y
  55.         : U, n8 ~6 a0 i4 c
  56.         //每排序一次都把数组打印出来
    % s6 u- d( D$ I. v
  57. //        for(j = 0; j < length; j++)4 c. Q9 c1 c* I6 ?: K
  58. //        {$ i: S( k$ d$ s8 _6 q' [5 D4 \
  59. //            USART_SendData(USART1, arr[j]);
    # B4 C5 k3 p; Q( E" R/ K$ v5 J# \
  60. //            while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
    " G& s- E( K1 }2 s+ G1 Q4 ?, l2 s0 }
  61. //        }
    ) E$ s; v0 Y+ `8 U0 N) C
  62.         }
    ) A; o0 n: J# ~2 Q7 {! h
  63. 2 f/ Z% h% j7 Y) r; y( J8 d- @: x  z
  64. }
复制代码

7 @: g3 N7 U: C; ~
  ^% B) ^5 U$ r5 p( v2 }
* i( c7 N; X7 z/ c
收藏 1 评论6 发布时间:2019-5-24 16:57

举报

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