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

对冒泡算法的优化

[复制链接]
haocheng996 发布时间:2019-5-24 16:57
本人参考网上对冒泡算法的优化,再一次进行的小小优化,欢迎各位指点
7 S. H& x8 `* R# l$ o- R0 R  m' c( ?  ?$ c$ q
  1. void bubble4(uint16_t *arr, uint16_t length) : \' D! `* j2 X- _) F7 [
  2. {* o4 i) C3 M) B- n
  3.         uint16_t borden_right = length -1; //右边界初始值4 ?" }; r. W8 |+ v9 K8 i( d
  4.         uint16_t borden_left  = 0;         //左边界初始值为8 x5 T2 X. B4 Q: d) f
  5.         uint16_t lastPos      = 0;         //记录右边界的值
    ' v- C2 D' H$ m# A
  6.         uint16_t prePos       = 0;         //记录左边界的值) L% e: A, V1 @* }3 w
  7.     uint16_t temp;                     //交换的中间变量* z" Z( R  [9 l7 B8 A2 B5 U, A$ i
  8.         uint8_t  flag, i, j;               //是否有交换的标志     
    4 H# o* H. C4 c9 [/ g/ T
  9.     . T- v$ p  `  Q1 j  d% m' m
  10.    
    ) ^3 p: }5 I* {4 P
  11.         for(i = 0; i < length-1; i++)
    & L) o: B9 k4 s4 G' R1 @9 B/ x7 ?: T
  12.     {
    ; o' M" J+ ~6 ]' H  Q! n
  13.                 flag = 1;/ Z# j6 h9 {9 i8 k6 [3 B. ]

  14. 9 l4 [% `/ w$ o+ y$ _* }
  15.                 //正向找出最大值
    ( y. d/ y0 v3 Z! f* }( w7 m$ X
  16.                 for( j = borden_left; j < borden_right; j++)
    9 [; a5 K  x0 `0 j) S
  17.         {
    5 Z2 D: a  D; U
  18.                         if(arr[j] > arr[j+1]) : V+ w1 s$ D+ ]# x( |. h
  19.             {
    ( B- ~" t4 ]! [2 a$ O7 w2 x1 a
  20.                 temp     = arr[j];
    & Q3 @3 O; Y( R: X7 d3 c
  21.                 arr[j]   = arr[j+1];1 }% R6 K- ~+ K) R$ u. `
  22.                 arr[j+1] = temp;
    " j# _% X4 }7 b/ O: G$ ^1 e$ d, U
  23.                                 flag = 0;" b( |+ G' m) G- K( ^
  24.                                 lastPos = j;0 L  v: p: O; i; t3 ~+ l, e
  25.                         }
    , R' x, Z/ Q0 h9 @) m, Q! `  B
  26.                 }
    6 e2 d) X2 }/ K% @$ d* V1 u
  27.         
    ! Y# I4 ^3 I, t
  28.         //正向没发生交换就证明数组已经排好了
    . U1 x. q* K0 J, S, H5 p2 O" E8 n
  29.         if(flag)' j$ |- C" Y! W& [2 l% f/ v
  30.         {; {* z+ q" Y2 b' t( ~& V2 B
  31.             break;
    ' t! w. W; h/ v% o
  32.         }
    . m+ Y+ }8 u- |+ m% h! c! b0 b( s6 \: X: l
  33.         4 D# g& z4 N: V; j4 J( a+ b4 k# b- z
  34.         borden_right = lastPos;7 \) k" z. z; k( l# w* P2 P
  35.    
    & C% E2 S2 n" K9 C* @
  36.                 //逆向找出最小值/ Q4 }: O% b8 l: v9 l
  37.                 for( j = borden_right; j > borden_left; j--) 3 b; }* ?) C0 V% E
  38.         {
    , m  U7 G* }% \) P5 H" {- p, n
  39.                         if(arr[j] < arr[j-1]) & a' v7 C  w7 }: F0 r  |' B8 u* _
  40.             {
    ; g$ e. L( n6 v2 c. Q
  41.                 temp     = arr[j];
    + v/ \$ r9 ]3 p0 b* a
  42.                 arr[j]   = arr[j-1];2 V5 y  T* b, s7 S1 `
  43.                 arr[j-1] = temp;/ o" W0 m7 s) u' F/ U
  44.                                 flag = 0;4 h) ]. ]% ~( {$ z' Y
  45.                                 prePos = j;; e6 P, n; B2 J* w
  46.                         }
    $ B- A9 g( H5 z) r3 Y
  47.                 }8 Q& }! z. C- S7 }% {
  48. 7 w9 J/ g; ^% S7 V: S
  49.                 if(flag) 1 r7 S( `7 Y- o4 M7 b* @
  50.         {
    ) o5 A$ _: {* B$ `$ u
  51.                         break;8 ?6 [7 u$ @6 n6 k/ h: }
  52.                 }3 u* m# r* j9 x* E. S& k
  53.         / Y9 t* T( K3 ^4 f0 ^( f
  54.                 borden_left  = prePos;
    5 n) L* D" F8 `" {/ n
  55.         
    : L1 M$ ~$ B* g! e
  56.         //每排序一次都把数组打印出来
    : y- F0 V, A* ~) q$ f
  57. //        for(j = 0; j < length; j++)
    ! C4 z& {) B2 V& P: _- X
  58. //        {% k2 \8 e) v/ G  Z4 w0 W2 |2 c
  59. //            USART_SendData(USART1, arr[j]);$ S& P6 r& g# x1 X8 o
  60. //            while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
    / ?0 }% D5 r& R# n
  61. //        }* T! A$ ^5 N& V/ ]* i& T
  62.         }( k* _' c8 h  u) K/ S9 J" t" j
  63. 1 {6 s# W! t  v+ e  ~
  64. }
复制代码
5 X% R3 `2 \' n! o/ H- i1 W; o( m
1 b3 u( M. N& U  |$ d. W& F4 h4 z
" @  S2 Q8 I7 v0 f9 e
赞 收藏 1 评论6 发布时间:2019-5-24 16:57

举报

6个回答
STM1024 回答时间:2019-5-25 17:58:03
从时间复杂度上,你比原始的冒泡法系数还大一些?
奏奏奏 回答时间:2019-5-25 19:19:43
我觉得所谓优化,应该是有明确的对比参数数据的,比如执行时间消耗短了,占用RAM变小了……等等, P% G, Z7 s4 J
如果楼主能提供这些数据,我觉得更好
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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版