QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1875|回复: 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实现)
    ( q/ h9 q; i9 ?" ^/ _' f
    ( v7 s. T3 |( z7 b+ W7 j: ^选择排序概念
    8 F( r3 K7 K9 N3 {, v        选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike
    : l0 p9 U3 L+ J) ?, M9 y0 M6 I' S. w  Q! \9 B3 ^
    思想
    ( t% j) k: @0 Z  Z3 ^: k+ \*     每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置" h; H1 E0 a7 z; _. U  l! c
    *     长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;% i2 n+ |: k1 P, l- r7 q
    *     当进行下一次排序时,范围缩小1
    " P* {6 Y  L: ~7 w
    1 u& X+ O, M! o# w* W; M$ V- L' |' ~. b代码实现
    3 Q8 V1 ?( |" \5 O$ qpackage com.lll.datastructure.sort;2 e7 k5 G: I' i

    0 ?, _* p# o  _. Himport java.util.Arrays;! _9 v2 N+ a/ U, f& u

    / S# Y- Y1 v( i6 D! u/**
    ) P0 [  k: \1 Q2 p *   s7 n1 i! n6 O, a
    * @ClassName: SelectionSort
    + v+ M- H6 S0 o" A8 _) N* @Description: 选择排序
    " ^' I7 o) E4 @+ Z2 {* @Author: liulianglin0 m1 r& g) T8 ?: D3 ]
    * @DateTime 2022年9月7日 上午9:12:13
    ) k' j4 t  v! m. m3 M+ {*
      n- D; n  y9 h" F) C0 G* 选择排序思想:
    + w. o7 V, [- Y: }7 I# v6 w% e*         每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    : u! h0 t& F8 P/ H*         长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;/ _1 U$ I. S5 p6 w- D! h# V
            当进行下一次排序时,范围缩小1
    2 R! b  h/ b2 H$ \: g */
    1 b( ~/ n7 J: Ipublic class SelectionSort {
    ! N+ K# _$ X* J% D7 d5 s7 m  `# J        public static void main(String[] args) {  B: }2 u: f' C* C% ^% t% K" w- o9 S( [
                    // 待排序数据( o5 ^. ^4 s1 `6 f7 |0 I- i! D
                    int[] arr = {1,3,2,4,7,54,11,34,9}; ( P- B& `/ Y$ x+ J
                    . Y; e+ H; y- j  c; Q
                    // 记录当前趟数查找到的最大值的数组下标
    ( @  W: s! ]1 B                int max;
    2 t) Z* s) Y& E7 ?* T               
    ( x1 X1 W7 I+ C# l( ]/ t% j- `                // 交换变量
    & p9 @: \6 d' O0 b: S6 z) Q                int temp;
    * N: {! @5 L6 i& \4 Q) p9 q               
    / j% p  K2 U; m" L) F                System.out.println("排序前:" + Arrays.toString(arr));8 I! E: M( q+ J8 k$ F1 A
    7 m( q; t1 _( M7 D- p' B
                    // 外层控制循环需要排序的趟数
    5 [0 d- s; H1 X1 I: k: e                for(int i = 0; i < arr.length - 1; i++) {' }* d0 a; z  p# ?* m4 |
                            // 每一趟都默认数组第一个元素为最大值% P% h5 ^2 T" F9 ?4 @
                            max = 0;
    * B" V. H  {+ B( w+ H                        0 d8 N+ x  }2 A& Z; g; B: j8 F$ x
                            // 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标" D6 d; Z  z  O; ~' c! j
                            for (int j = 0; j < arr.length - i; j++) {
      U2 C% O9 y" r4 G8 Q; q2 E9 C                                if (arr[j] > arr[max]) {
    ) _3 _2 P9 X( c) Q( e# h9 o& o                                        max = j;4 n" y1 K1 p/ F( E- o' {7 \9 E
                                    }
    - D$ Y# n- o# D& J0 k                        }
    - \1 w$ T& u3 G6 r- Q* o1 j/ k' V- |                        - D9 G3 X0 f* S3 w% k0 I
                            // 将交换变量设置为最大值, 将最大值暂存一下. N+ z9 p4 d# Z7 u. C& \% ~+ ]! Y
                            temp = arr[max];& ^2 E8 E5 j. d" c
                            // 将当前最大值设置为当前未排序序列的最后一个元素值
    6 f% V# h. Y, k% b                        arr[max] = arr[arr.length - 1 - i];. e( e# v7 J& ~3 h; {! y3 V( z# {1 J
                            // 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换4 ]( Q& ~7 T/ j8 y. Z
                            arr[arr.length - 1 - i] = temp;
    , N0 j/ i3 _, i* p2 `) ]' x                }
    ( {7 t7 _- }( M  `" i               
    9 M6 [6 d7 m4 T( D5 G7 h' ^" s                System.out.println("排序后:" + Arrays.toString(arr));
    & m! M  o; K5 [' d0 g        }9 \0 C+ H& ^; y  _2 m! m
    }! i5 ~2 n2 d+ i4 ]7 Z0 T
    * }5 _# D" Z! Q0 h& z' r
    关键步骤:
    3 r6 }' x& I2 p! L- i- s$ p
    * `( D* ~5 d( Y, Q: Y3 w0 V  j; h1. 首先定义两个变量:分别表示最大值标 和 交换变量;# @1 U9 g$ `9 o7 B8 v" h7 u$ S  k

    + I' I+ X8 q4 z( X8 }9 M6 q/ F2. 通过外层for循环,控制排序的趟数;- [8 [( S$ P" }% \  O- T0 k
    + _7 p. E( l) ?0 o6 [; ^% Z! p
    3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;- j0 O% H5 b8 d  F$ L

    0 {, U3 z4 X" d8 ?4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;
    ! ?$ w. Y( ]9 L: n9 n# w
    - c4 }$ g7 w! H7 E2 D2 \/ {5.然后将最大值设置为当前未排序序列的最后一个元素;
    $ A  s8 f# W( X
    / m8 B) [% E) w. {6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素
    9 ?/ M+ ]7 D. e$ J2 G, O6 i2 e: I; ?7 p0 _2 U8 D( G
    7.至此完成数据交换,继续进行步骤2,直到数据数据有序。# {4 b+ f" r( ]- q; P

    # A! A$ I! s) Y& I4 b- d/ G& l 执行结果
    6 w* \# `; C& ?- g; }
    8 u7 r/ J6 Z5 \( g: H————————————————9 U2 |8 s7 _0 q5 l2 h
    版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% \6 j0 b! ~2 O. T
    原文链接:https://blog.csdn.net/liulianglin/article/details/126741594
    2 ]: `: l  i; h; w. {1 Z& w( z& J" A, Y% `) m% t- k

    * |+ p0 x: C, W# z' M1 O
    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-5-28 15:07 , Processed in 0.438698 second(s), 50 queries .

    回顶部