QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1899|回复: 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实现)8 f: ?8 ?5 a5 b- Z5 `& }

    3 p$ U$ l' b% w6 J* `- L, q- N选择排序概念
    # F8 V, K$ {8 S. r  ?& N8 A; ?        选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike
    . R3 I  y6 C0 ?- B# m+ l
    # B3 X2 S: T% I, d思想. `0 t; v% C1 z/ W9 Q
    *     每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    9 w; w% H/ i6 g3 w2 u*     长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;1 ^" z' t9 I( r3 {3 Q8 f
    *     当进行下一次排序时,范围缩小1
    - z0 P8 r5 c% u& ?# u1 X# Q
    ; r4 P) V: E* `$ ]代码实现
    % {, r' j% T. v3 b& jpackage com.lll.datastructure.sort;
    4 V8 `5 R8 [- b2 _) v% t6 j
    " a% I0 g1 F- q' ^( ~; T6 ^% cimport java.util.Arrays;; h/ S/ ~0 @$ l2 {& \

    2 `: u2 l( v5 c' b- B/**7 }$ `2 V; s, \. W
    *
    4 \4 l7 h8 b. H* @ClassName: SelectionSort
    * T, Q* A7 @8 M% p4 L$ b$ c* @Description: 选择排序
    # V$ w# Z! g" Q/ X; Y" a" m; g* @Author: liulianglin
    * t7 k. Z, o6 J; o# f6 y1 i' k  w2 h* @DateTime 2022年9月7日 上午9:12:13
    ' M7 i( D8 k1 P+ R/ j& m*
    3 F( C( o6 e* V, m! \0 ^' P0 P* 选择排序思想:: p: X& I' {! K5 N7 g5 `
    *         每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    7 c. x- U) e( G' V) J*         长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;( q% @( w3 O) U- |
            当进行下一次排序时,范围缩小1
    1 ]1 Q3 E8 K& t7 ^. R9 f& j5 m *// ~  ]" i: w* G6 }3 I7 t! x8 e  k& g
    public class SelectionSort {
    ) B: Y) e; z. ?1 f1 W- v4 {3 P8 A0 a8 w        public static void main(String[] args) {
    ) I/ \7 A9 ^9 f                // 待排序数据5 p( L) J( m/ K6 `5 h/ D) _6 Y
                    int[] arr = {1,3,2,4,7,54,11,34,9};
    3 a& w$ W& e; u) V( M2 E+ j4 B3 A               
      E+ Y: ^; r+ v1 h3 h7 D                // 记录当前趟数查找到的最大值的数组下标
    $ J) |1 c- B: i" d& E8 Y                int max;
    6 O  C9 a- x  F8 w6 e               
    ) c, b6 h/ I: U- ]; V$ q                // 交换变量
    ! m  U& w* G- V+ }6 M                int temp;" v2 v' C+ E* Y) |0 G- ~9 f
                   
    5 L0 K0 |5 l2 d5 r( u& R                System.out.println("排序前:" + Arrays.toString(arr));' O) s6 y6 O& S& b

    & A* g, `/ P; @2 {                // 外层控制循环需要排序的趟数
    & a* ?6 w+ B$ \  ~                for(int i = 0; i < arr.length - 1; i++) {
    # r$ r* p7 k0 \# _- X( {; G                        // 每一趟都默认数组第一个元素为最大值
    ; Y3 ?+ r5 N) O) }                        max = 0;0 r4 R2 F$ D& {1 v* h8 g
                           
    " L/ l5 }5 V& ~8 y( G4 ^8 M  @/ g1 E                        // 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标& d) j/ o. U: A: `- n. C# ^
                            for (int j = 0; j < arr.length - i; j++) {1 {: i; ]7 x0 q# Q2 Y, j5 k2 G
                                    if (arr[j] > arr[max]) {
    & S+ j; R. o$ B                                        max = j;9 t) ]" H' K; }7 E1 C
                                    }
    ; Q# N' J' y% e6 O                        }* N- w0 m( |5 N2 f  @6 g$ u6 s
                            9 W8 b& |$ S* }6 ^$ l
                            // 将交换变量设置为最大值, 将最大值暂存一下
    - l8 ]) R- D' X9 n                        temp = arr[max];
    , y! I7 L3 M) @% i( R                        // 将当前最大值设置为当前未排序序列的最后一个元素值
    0 p1 p( ~( D* B3 y9 F, U9 q* ~. D                        arr[max] = arr[arr.length - 1 - i];1 }$ o* D2 p" ^' c' K- S; t
                            // 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换
    " s( z  w6 D3 K# C  z                        arr[arr.length - 1 - i] = temp;
    ( v$ A7 C+ K# X                }
    : G! \. x5 {4 Y7 O               
    ( U$ C/ E4 ~3 W) Y  x) I3 Z                System.out.println("排序后:" + Arrays.toString(arr));% ], z, s2 L% Y" Z% U& Z8 {4 X
            }
    " ], H) B9 J* w! T% A2 G. u}
    / o" l) G* `6 P0 E
    " C( ~; j: K+ ?' N* ?关键步骤:
    2 U4 _# E6 ~$ k% g. v4 G0 l$ e' E; O( I
    % Q1 I0 h' _: r- B* P0 [4 m1. 首先定义两个变量:分别表示最大值标 和 交换变量;
    , o6 R1 t9 T# O- Y8 V- Y' X" r# E; ~( i0 d- G4 o' ^
    2. 通过外层for循环,控制排序的趟数;$ @, R7 B3 O6 ]
    $ V. ~2 I  p* W/ z
    3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;
    # j" e/ q, i! a: m$ J7 [+ o
    % }7 F2 |, _7 p4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;
    3 Y" }4 Q! O7 b  M: o) l' q" d. c9 F7 \7 U- ]
    5.然后将最大值设置为当前未排序序列的最后一个元素;) z% \5 H2 \; Z( ^0 y" B( X3 p

    8 s; H7 p  n: B1 O6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素
    ( [* ]5 C9 M5 L- M; M8 o! c5 K/ u# G+ d: p$ g  R* B/ d
    7.至此完成数据交换,继续进行步骤2,直到数据数据有序。3 s) R) b  z$ O7 j
    : L9 H, `! _) z9 p2 T
    执行结果
    0 W8 `9 ?; L6 h6 U
    & R: Y8 w( Z1 M————————————————) W0 Y  W  G7 G  n( c! I" i- Y2 a9 n% G
    版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    : |! v* m+ h7 k  R* F  j原文链接:https://blog.csdn.net/liulianglin/article/details/126741594; g( W7 I3 P5 {: H$ y

    2 P* v5 ]2 P; I# J8 }; v# U0 F& ~' U. ~  |
    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-29 03:22 , Processed in 0.464686 second(s), 51 queries .

    回顶部