QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1851|回复: 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实现)
    ) B: y* j1 N0 j7 |/ o7 G; z( {& N. r0 V  v; p. k* U
    选择排序概念, y+ ~, U( [# M$ G* r, P
            选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike1 W. Y( f, Y2 V0 _
    " H* D# u" }. Q! x- ]
    思想2 Z' j" G0 l1 b4 Z- i2 |  v3 t
    *     每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    3 ^  b( p1 Z. I+ {* s*     长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
    7 {5 o; M/ ~# ], c5 t, J3 H*     当进行下一次排序时,范围缩小1
    : Q6 y# q  ]. I5 i- Y: \) y# @, k
    % }9 }0 O( {# a4 E) x& F& c代码实现9 K. H, S; T% K( L1 |% Z
    package com.lll.datastructure.sort;1 m# V; R" C5 j6 c5 @

    8 K6 J$ y, o4 X8 ?( Bimport java.util.Arrays;
    " V1 \. Z& ^5 K) Q1 N4 l% o) {& Q5 a7 ^
    /**
    7 j$ [; ]' Y+ ]* B5 r4 i# S * . `$ b! C' x9 o. O
    * @ClassName: SelectionSort
    + K3 Z& O; F, G% M- V+ A) v* @Description: 选择排序5 ], Y% g8 }3 k+ f& D
    * @Author: liulianglin
    * r) H( [1 R6 X* ~9 p# V* @DateTime 2022年9月7日 上午9:12:13
    - q$ R$ X4 Q( g. m4 u9 a  ]$ U*
    , ]+ y5 }1 d/ f: K, V( A, v$ T* 选择排序思想:5 R( g5 N! a, g% K$ P& D  R
    *         每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    0 p: e+ O; r- s*         长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
    " U8 A" {6 _% T# T        当进行下一次排序时,范围缩小1
    . W1 @$ F: W) |" W! d3 g8 m */
    5 X. w% ?  h- epublic class SelectionSort {
      H) L8 i( e0 ~0 [! k' u7 V        public static void main(String[] args) {
      K. ]" g9 d9 P5 Y3 [9 w, e& V2 S                // 待排序数据; {8 u+ h# U6 p6 F8 x
                    int[] arr = {1,3,2,4,7,54,11,34,9}; 8 M8 s" Z( r3 B. d% J- f
                   
    7 H7 G) M& ^; y# H                // 记录当前趟数查找到的最大值的数组下标 6 [9 j2 F- s* S3 g# f, O
                    int max;% i8 Z8 C$ {  e8 Z
                   
      p  S+ ~  q9 m                // 交换变量6 p2 k% B1 t, f* B
                    int temp;3 E. W& K7 q! H3 F. @; p( f& i
                   
      u  s, f" Z: k. Q: m                System.out.println("排序前:" + Arrays.toString(arr));
    ; c9 r/ r* u2 j  s- b& s) V; G( D. I; a" K0 A) q
                    // 外层控制循环需要排序的趟数
    . l* c) g0 X% g5 C1 F: a" w7 [                for(int i = 0; i < arr.length - 1; i++) {
    1 n' h3 q+ N1 Y3 A8 }4 W                        // 每一趟都默认数组第一个元素为最大值- U! \( x$ P' \& |( ?6 x4 M
                            max = 0;  L. z' T4 g5 Y: ]  G
                            5 l8 D6 X# G1 P- H# l1 K5 z
                            // 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标
    7 e& `4 b, O6 S4 Z( F* k! o5 f2 C                        for (int j = 0; j < arr.length - i; j++) {6 R8 j! C0 Z, X8 Y0 B6 k6 K
                                    if (arr[j] > arr[max]) {( }- r  x7 ]3 v! ]( k. X
                                            max = j;; H$ G0 {7 d8 ~8 U9 r  q
                                    }
    5 S' B$ l+ i) _0 }. p                        }
    % I5 J; k# m. [                        " y- r# l" c4 |% j- V
                            // 将交换变量设置为最大值, 将最大值暂存一下$ w2 k; R0 i+ Y; \
                            temp = arr[max];+ U$ F6 R& E6 Q0 D2 |
                            // 将当前最大值设置为当前未排序序列的最后一个元素值
    ) V: G& M5 M/ U: U3 y( S* t6 a  i- p                        arr[max] = arr[arr.length - 1 - i];
    ( _, g  O( b& E% b& X2 h0 F3 ?" B                        // 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换- R8 w& c# K  C6 Q1 z
                            arr[arr.length - 1 - i] = temp;4 }4 s% u! u, c3 R
                    }
    8 H# t8 X9 h4 @, I. [9 @                - c6 e5 d2 {% G$ q: ]
                    System.out.println("排序后:" + Arrays.toString(arr));
    8 V: F% P" g' q        }, Z( }! d1 L# N' w& w% a
    }
      a: T& c* q3 J5 |' I  e$ z! F& Y) k. ~8 _; y
    关键步骤:# w  s1 e. T# ?5 E7 b% X  k

    , E% R( ?* ~9 C( R" _1. 首先定义两个变量:分别表示最大值标 和 交换变量;
    % Z0 q& E0 |0 U* b( x) g% u0 {  i
    . N3 f" e! p+ _3 R' [6 T2. 通过外层for循环,控制排序的趟数;# S; o& }7 ?  b( N. ~

    2 }  R9 c: e( T# a0 M. E8 h3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;
    8 l7 \8 R4 i1 |7 S! u
    2 t$ H, u, p0 [; V4 @* q' a% o4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;
    : v) T$ K9 T* U9 U  L4 U2 o8 \+ B1 O9 @
    5.然后将最大值设置为当前未排序序列的最后一个元素;% w" D' `7 {: N9 [4 e: _- z' b0 I
    5 Z# q9 m: `5 w
    6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素
      ]6 k8 ^6 w7 E; v- r( n" B! w
    1 t% O' \7 R. ^- F5 r( E7.至此完成数据交换,继续进行步骤2,直到数据数据有序。
    0 D, m9 p6 r1 J
    % N: W* w! h' D" g* Q 执行结果
    ; ?: g; j2 l$ {
    - G% o& m* N; M6 x3 B9 w  w————————————————, u& ~. Q% \" A" I
    版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    3 T8 `8 }( l4 J% @- [' W/ e原文链接:https://blog.csdn.net/liulianglin/article/details/126741594
    , [+ H% p$ i0 }
    # X& @2 H0 A8 t: z# e. l4 g  [3 A3 U" ?  p4 g
    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-4-10 16:32 , Processed in 4.149545 second(s), 50 queries .

    回顶部