QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1920|回复: 0
打印 上一主题 下一主题

排序算法--选择排序(Java实现)

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2022-9-8 10:05 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    排序算法--选择排序(Java实现)1 g$ A9 Q* f$ x8 M) D( t  i6 W
    7 T, \0 R+ l9 @
    选择排序概念
    ) _6 L2 x0 s0 Q7 y- F6 W+ i% N        选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike3 }4 z7 X9 v4 S( j8 ?. l
    0 n! a0 \4 K! R: @! R0 h9 T
    思想
    $ K0 E: N2 o: Z$ R& y; P*     每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    * w9 |2 D8 |) f*     长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
    * u/ ^: O; q& B; |: B3 Q*     当进行下一次排序时,范围缩小14 L: Y9 U/ n2 Q" ^- e& V

    $ A6 x: V! ]# V' k# F代码实现
    $ Y  _6 N, Z- @7 Fpackage com.lll.datastructure.sort;
    - O9 M, R' c& b% B6 t
    9 z( E& l2 w$ dimport java.util.Arrays;* G) v: j" z2 ?4 {! D8 q3 n

    ' n4 S0 k; R$ D7 Y/ ?) \/**  [9 Y' G4 l' b. C# D/ D* ?, w0 C! K
    * 7 _4 s) d3 T3 ?& k
    * @ClassName: SelectionSort  T" M8 k% p- U) O, K' y/ {& M2 ?
    * @Description: 选择排序
      N5 v( P. g$ @# B0 n* @Author: liulianglin6 B% Y( X/ k' W/ g/ |( e- h4 E8 x* Y
    * @DateTime 2022年9月7日 上午9:12:13
    # B, H4 C- m6 [; j# j1 V- H, r*
    ' l9 v0 U, }1 g6 P7 p: V/ c* 选择排序思想:: l. p& N8 w/ l5 F) O- `: D
    *         每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置* K8 }% i: e& B
    *         长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
    , O( m: p) G& X( J        当进行下一次排序时,范围缩小1: W% \" N! E9 A0 F( ~
    */
    " a/ H% n  _8 q$ \2 v% S2 Kpublic class SelectionSort {
    , c, P; m1 R. s- j( n& e        public static void main(String[] args) {
    7 y: U* E  S& t, O                // 待排序数据; ~0 A* w0 g' q
                    int[] arr = {1,3,2,4,7,54,11,34,9};
    4 r& O/ H5 |3 t& P+ C! x               
      ~, e2 S: c- ]" l/ v' X                // 记录当前趟数查找到的最大值的数组下标
    $ t8 o/ q2 V% R) h0 D. H5 h  ~0 q                int max;
    4 I# W+ ^' ], h' s: W! L               
    , k. \+ w$ Q- ]7 ~0 F                // 交换变量" Y5 F# E" k! \
                    int temp;' q  D& c; w, _# T
                   
    & C2 J' S5 `; Q! h                System.out.println("排序前:" + Arrays.toString(arr));; P$ f* _+ q. [1 T% g9 N

    - G: P$ `% S6 X* f" i+ n                // 外层控制循环需要排序的趟数
    * y, f. R' \- }% \                for(int i = 0; i < arr.length - 1; i++) {
      \, J5 z  q' L" n- O$ Z* l( \( P! B& s                        // 每一趟都默认数组第一个元素为最大值, W9 m2 n3 c* `' k: H5 e
                            max = 0;
    + M! d8 k! q9 N; T/ v0 {) V5 f' G                       
    " x+ d/ X/ |9 q2 O/ Y* ?  t                        // 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标: a4 R' [& G" q8 \& I
                            for (int j = 0; j < arr.length - i; j++) {
    8 ^+ I& e9 I8 V                                if (arr[j] > arr[max]) {4 U1 c" |( c1 v* Y5 H; D9 x( I+ h
                                            max = j;
    ) m' p! P' `2 M* s# W% n                                }! x1 b. j" U; R# G* X% L1 u
                            }
    % Z" ]# A% l# R3 g7 C/ h4 G                       
    ) g7 y" G! a- s! F+ E                        // 将交换变量设置为最大值, 将最大值暂存一下
    ' d& b5 M5 O# N( T; n, g                        temp = arr[max];: P" S9 T8 }; X) `# j8 R
                            // 将当前最大值设置为当前未排序序列的最后一个元素值; f2 L9 U# |( \
                            arr[max] = arr[arr.length - 1 - i];$ B* ~7 J& r* `" P: j
                            // 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换
    / i2 j0 X$ ?+ S                        arr[arr.length - 1 - i] = temp;6 L6 n$ J; B' I4 a& K( J
                    }" |* R; h& G+ R! C9 I1 l
                   
      t2 C  t" D; O, ?, U                System.out.println("排序后:" + Arrays.toString(arr));
    ) ?/ S+ y# H+ C+ S* }        }" G3 r0 s5 L4 Q8 v3 r" n
    }
    , W+ l$ |, W3 H+ L
    8 B- B8 E, L& y关键步骤:
    ' k: _6 }# u% K9 |- I# F/ @
    5 g. I2 o2 d. g/ U  i1. 首先定义两个变量:分别表示最大值标 和 交换变量;
    / Y# k5 l/ a1 s' ]3 J; P
    " d) j( `+ ~7 \* o2 e/ Q2. 通过外层for循环,控制排序的趟数;8 z% Y, ^2 w; d8 b- U
    , s- i9 o  r& i; ~
    3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;1 {4 P$ j, k7 m1 n0 u

    ' \$ s! w8 [) d  o. x( I! I# Y- ?4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;
    ; x& u5 f/ G- ]1 E3 f' G' e
    3 b+ V  o5 l! ]5 s: s" M6 }5 R5.然后将最大值设置为当前未排序序列的最后一个元素;1 s4 [6 \/ T, F2 y6 J5 q% ]7 U, q, M

    & |3 V% y8 S) ^2 K  ]- O. w, o0 Q3 u6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素  w9 c5 U' m6 e/ o
    " g. N2 V/ ^  t4 L5 u: D
    7.至此完成数据交换,继续进行步骤2,直到数据数据有序。# @* s! V; g1 A5 `; @/ w8 }, f, k, L
    ; h$ F3 c! D% Y4 K7 v
    执行结果
    9 z# @% U  z3 K/ |( A
    * b4 q; U9 {& [/ G4 i# j) e, ?( a————————————————2 E% v: ?8 y, p3 T/ n  R
    版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; N0 c2 J+ `  p+ ~
    原文链接:https://blog.csdn.net/liulianglin/article/details/126741594  S0 g) c, S. O1 X

    - u4 d, t4 t/ P% u1 Q1 j! h  m' F
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-9-13 20:16 , Processed in 0.279305 second(s), 51 queries .

    回顶部