QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1894|回复: 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实现)- }- ~3 h; z- s3 |2 f8 D/ o9 s& P" ^

    " Q. P. k. I$ D# P' `2 R, V选择排序概念! Z' q5 R9 S. d7 H! R
            选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike
    4 Y* T6 u, l" T: H
    , j5 M' w7 b: q0 g思想
    + a0 k5 @4 m7 E7 W6 m9 M8 z*     每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    & r8 Q( [, d. H7 K+ ~1 }, z! U*     长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
    2 r3 }  [& {# L*     当进行下一次排序时,范围缩小1
    + L, ^; R, L8 t' L- e& U% b) C
    3 }7 _6 C' W$ {( e4 Y7 r  e代码实现
    2 x; w. K; F/ G5 R6 o2 u: a( m0 x+ N: hpackage com.lll.datastructure.sort;
    0 Q4 b/ L- y5 O6 B& H6 I: P4 t; z  U8 X0 I2 K0 Q- d/ u
    import java.util.Arrays;
    & N4 |: i  |/ g/ W( p* Y) F4 Q0 t4 s! R0 q$ @: V/ L. D: \
    /**
    # B) [8 j. [  Y3 g * % U" c. y5 z' r" u7 K& T" g5 i
    * @ClassName: SelectionSort7 v, B0 g; v9 I4 P
    * @Description: 选择排序" ^+ g! {, K  s1 M+ S
    * @Author: liulianglin
    ( \' Z6 Q1 A6 {' ~* @DateTime 2022年9月7日 上午9:12:13, u( d9 `/ A) @0 z! f
    * + J5 {. y8 k6 x7 L( k/ L' v) F: O. \5 z
    * 选择排序思想:# Q" l1 }# `4 a3 m0 p* g% N4 ]
    *         每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    ' A3 ]: W0 r5 X*         长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;5 `5 \& ^0 j  C9 m" {9 C
            当进行下一次排序时,范围缩小1, W* O0 i; v: d8 j7 f" y' _
    */
    1 l  u& E5 U! t# Ipublic class SelectionSort {
    $ F) R: l4 g! n# k. L  j0 a# j        public static void main(String[] args) {% _6 u. d* u. n( j+ {; R2 y
                    // 待排序数据/ o) v4 d. @9 E7 j! s
                    int[] arr = {1,3,2,4,7,54,11,34,9}; 9 [# e! t  z2 B% y8 J
                    - s5 W% W; V- }$ y  t  p7 T* t
                    // 记录当前趟数查找到的最大值的数组下标
    " A, D; M7 B* K                int max;
      _5 t( Y" b3 Q, H                7 s: j, t) y6 a8 O: T% s
                    // 交换变量$ t# r& z# i( j4 j4 b; @- X
                    int temp;
    3 t$ M7 Q# }+ w" g- [1 M8 z6 c               
    # k! Q- s$ `( r* W2 V- d6 ]" @! o                System.out.println("排序前:" + Arrays.toString(arr));! ^7 V# s, f6 y: \+ i
    & s0 K+ W: B& Q0 m6 }
                    // 外层控制循环需要排序的趟数
    2 q/ e2 ]" ], D9 u7 p+ v3 Q& L5 s                for(int i = 0; i < arr.length - 1; i++) {
    - [' a0 U7 e" W; S8 l& g                        // 每一趟都默认数组第一个元素为最大值
    - Q: I0 R( r1 X$ V+ u                        max = 0;
    ! H+ ^' W* b4 |                        5 }) V* T+ f/ i4 Q/ M
                            // 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标
    9 ]% S# n1 P0 @) J5 k  f9 s                        for (int j = 0; j < arr.length - i; j++) {! L% A7 {- ~- F0 @1 b1 Q
                                    if (arr[j] > arr[max]) {
    - q' _% M- V" u, ~9 M                                        max = j;# w& m0 k/ Q* U! y0 _" X
                                    }! ]* G: m' j- `. V( h% e
                            }
    1 h6 j/ G6 G, p0 T- J, j# u                        ! C5 e0 O9 d& l9 E5 m: F& o7 ~
                            // 将交换变量设置为最大值, 将最大值暂存一下
    ) ]9 c5 ?+ H3 [                        temp = arr[max];
    9 D% N# z( {& S8 }  ~+ _! F                        // 将当前最大值设置为当前未排序序列的最后一个元素值+ s$ F* F( Z9 U2 i- g7 j
                            arr[max] = arr[arr.length - 1 - i];
    # E( q. c6 w0 b% O/ P) `! I$ {% V                        // 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换" G' ^/ S- p( v7 f; N' q8 D
                            arr[arr.length - 1 - i] = temp;
    * ]& ]$ u. M- `3 X5 L) V" a                }" z3 K  Q. H/ A! o
                   
    8 L6 K( r; z; Z* D                System.out.println("排序后:" + Arrays.toString(arr));9 e- h. J) u. ?1 l. N8 S
            }* J+ @' p, x: F5 s) |
    }
    , ~0 I) |. ?9 {$ M8 I  M5 Z$ [$ \/ z% j" [; a8 }7 \
    关键步骤:4 ]+ W4 E# l  }- Z( s7 _
    ( J' D; N7 _# \8 ?/ V( Q* r" ^
    1. 首先定义两个变量:分别表示最大值标 和 交换变量;
    4 `# E, U% _$ h$ E  L; H/ f9 @+ m. P+ A5 N- P% }
    2. 通过外层for循环,控制排序的趟数;' f! t. A7 N0 o" S
    ; I8 b# J5 O8 S% b, v: w
    3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;6 k( ~7 x* o# ]  b

    + N. @0 }, s9 R! U4 s$ S, |4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;; D$ N/ {# M  T: w$ Y9 R
    5 ^6 L# w6 l' s2 J
    5.然后将最大值设置为当前未排序序列的最后一个元素;
    1 X! Y5 ]9 F6 D4 A  f
    ! \" C6 s7 X9 q8 ^6 l' L6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素* l+ z/ [0 N7 _. N' X
    0 P% H- P3 X0 D2 }/ \( N
    7.至此完成数据交换,继续进行步骤2,直到数据数据有序。! X( K6 w( v, P1 L) U1 j- M4 T5 A

    # `. R* j# I$ E! k 执行结果( F- B4 s, n, \5 ]4 {( X0 t/ S
    0 `! {, A" p3 |7 P% S+ @
    ————————————————
    + {7 G, X5 u, P. g版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ; |5 K2 c4 P/ H/ p  B# }- g$ X; Z原文链接:https://blog.csdn.net/liulianglin/article/details/126741594$ D: \! w: B8 `$ e4 O
      o: {0 A& q5 [' d
    . C  @1 O/ H9 i2 w$ ]1 J4 r  I
    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-7-28 08:11 , Processed in 0.505764 second(s), 51 queries .

    回顶部