QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1895|回复: 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实现)4 J& t1 S- f2 q( f$ Y6 Y% }

    ' M* y5 [5 q" |选择排序概念6 i* c7 }2 O- m6 t; O
            选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike
    ' B' T. t4 v* t  Q% i1 Q  _0 L5 ]
    2 U$ N, I# J4 a) F# {9 f* b; e9 z7 U思想+ |8 C9 G2 `5 `% c/ ^  g
    *     每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    0 F6 P+ t+ ^# t: L6 F! g. y*     长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
    & q; w; v1 h) @% Y*     当进行下一次排序时,范围缩小1# b3 i  L6 W9 @% U5 w% l

    0 o5 D- s1 e7 J. {. M代码实现
    7 E: F, Y/ e# Y7 f4 m) Ypackage com.lll.datastructure.sort;$ H$ t, S( J+ f0 c/ Q/ L" A
    % N4 t7 z) R3 K7 o6 s9 h% H1 P' Q
    import java.util.Arrays;
    ( f' C/ {1 c/ y; c8 C( q
    / U2 O1 o0 m6 v/**
    1 U6 g- T# w2 ]5 Q *
    * M! E+ q. S4 G0 F* @ClassName: SelectionSort- F1 J# M3 _# l# _8 d
    * @Description: 选择排序
    3 Y& f: `2 K# u% t; T* @Author: liulianglin8 M7 ~  C: ~; R0 [" Z4 a( [5 z
    * @DateTime 2022年9月7日 上午9:12:13: D' V- [) @( N. G5 i0 W5 w
    *
    # N* k5 {9 m- h. V* 选择排序思想:
    5 h$ s% Q# M9 r! `" F& Q# D5 ~*         每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    + Y  e+ A* F8 E5 T+ z7 }*         长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
    2 k- I  _/ w4 e- o1 C! i2 E        当进行下一次排序时,范围缩小1
    * p) B8 e4 }' i6 N: }4 `5 y */( O: }5 _& M+ E- Y
    public class SelectionSort {
    / w3 O; J& F4 Z7 H) S        public static void main(String[] args) {
      J# G/ f! S6 `3 z, f- \# L                // 待排序数据; h* ]3 c2 ]3 M( ]) ^: [+ H( k
                    int[] arr = {1,3,2,4,7,54,11,34,9};
    & Y; O1 d+ U3 C2 W) P) X                8 t# G9 j+ ?* }7 G9 Q6 w0 X8 o6 ]
                    // 记录当前趟数查找到的最大值的数组下标 ) {# D( T# G; i" o0 i5 d
                    int max;
    0 R4 T/ D' j' X. n8 Y/ y               
    1 l  q) N6 F. v: J7 f+ Y                // 交换变量
    " }( i* }& @$ A# ^+ }; C8 Y, U6 G- U                int temp;
    + s$ C) `' S; x  b                ! s- J8 ^* z: k. @( v& t
                    System.out.println("排序前:" + Arrays.toString(arr));' N' Z: `# o' f5 }

    / x+ c! b4 Q8 G. @- {+ O                // 外层控制循环需要排序的趟数, {. d" f( A1 H
                    for(int i = 0; i < arr.length - 1; i++) {
    / P% I$ o* y9 D( Y                        // 每一趟都默认数组第一个元素为最大值0 R: t. L; z  C" w6 {
                            max = 0;- R7 H# ~) G  ]; T8 u8 o6 W
                           
    3 G8 W4 K1 Z5 h2 a6 A                        // 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标. x) O. ]/ }) f  d: ~
                            for (int j = 0; j < arr.length - i; j++) {
    6 t1 ?4 A' T, K9 s                                if (arr[j] > arr[max]) {% k& a+ @$ o5 `
                                            max = j;
    . }. S# O4 w- U' c' C                                }8 i, D) V9 ]4 h5 f) ~; S2 N
                            }: [6 `2 r3 f9 y' ~
                           
    7 F$ K. C3 l# Z1 F- g2 p                        // 将交换变量设置为最大值, 将最大值暂存一下
    7 u% o# X5 D/ B4 t. p8 h* M( j, @: w                        temp = arr[max];7 O. x2 v9 Y! K7 _) O( X' d" {
                            // 将当前最大值设置为当前未排序序列的最后一个元素值
    0 v( R, Q. G9 q                        arr[max] = arr[arr.length - 1 - i];! e3 s% t( Z; J# X( }
                            // 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换- Z$ h+ c) ?3 E0 Z1 z
                            arr[arr.length - 1 - i] = temp;
    # f: W* }6 ^& S                }5 r3 U) u( z: s* N, x
                   
    # ^. ~6 \# z( X8 s7 ?                System.out.println("排序后:" + Arrays.toString(arr));$ |' \, y" U0 E
            }+ _$ E/ q$ o% \
    }
    3 C+ b- {3 g9 J3 L8 U* ]- }) c! f  X+ F$ {' _
    关键步骤:- c5 y0 F4 Z9 ^

    + m; o% r; t- `: C1. 首先定义两个变量:分别表示最大值标 和 交换变量;
    ( _. _) A( X2 Y3 M- U, g4 Y
    ; T6 E, v0 w$ X; G2. 通过外层for循环,控制排序的趟数;
    ) \9 a  Y3 q8 g* d9 p& M8 y) P# L4 f( T, Z2 ~/ t, Q1 S
    3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;
    ) k/ c: ~4 b' l6 \+ Y6 X; Q% p4 Q$ u
    4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;( u8 k/ s. ]8 c# {7 `9 ~

    / R& M/ w3 B  u- M7 @2 T5.然后将最大值设置为当前未排序序列的最后一个元素;
    0 `& m; T1 g: E. r) T. F+ ^. Y! f* @
    6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素
    $ ^& Y  v' b0 @% j, p  N" f
    ! M2 y$ b8 c6 A6 y7.至此完成数据交换,继续进行步骤2,直到数据数据有序。/ c# t# z5 A3 \
    6 m% C8 t2 T- a* ]# c; `0 c
    执行结果; _0 U2 y) V% {( h
    - O, ~$ a8 S/ x- ?6 I
    ————————————————" r% L7 D) g$ w$ u( z+ r# v
    版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。4 K4 r7 _. j( l% P
    原文链接:https://blog.csdn.net/liulianglin/article/details/126741594
    " j. f. c- N/ O* v  j; g  c  G2 z9 u% N4 ~7 N

    ' [  Z: F* T: z4 a
    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 17:04 , Processed in 0.306779 second(s), 50 queries .

    回顶部