QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1857|回复: 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实现)/ D* D  x: d5 r
    " S% V5 D+ }* e+ y: t: |
    选择排序概念& P5 s+ C5 x  X8 `) ~) `( F4 [8 M
            选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike
    9 e0 [, e8 P1 Z% c' v: h* M
    . s' [- B. s4 _* ]. ~! P思想
    1 R- ]" Q9 }5 r% \8 R5 O*     每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置# p6 n7 w1 `/ u! @1 ?
    *     长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
    ) q; h' i0 u' j/ {. o" @*     当进行下一次排序时,范围缩小18 o5 v: U* h9 J+ g/ ~; Z4 j; h$ b

    9 O& ?7 f: d* @5 D, p代码实现
    9 S( }) w- v1 x, rpackage com.lll.datastructure.sort;; J/ A! X* h9 Q4 W, F

    ( C! E7 _- ^$ J- r9 Q* x5 f, ~import java.util.Arrays;: r5 R1 w0 @; Q
    $ k' Q- ]) S8 [7 x
    /**
    7 e; V" d) Q3 s7 H; Y% Y *
    + k+ \1 B4 E; |& V* @ClassName: SelectionSort
      }1 z" b' T1 Q/ V0 H: `* @Description: 选择排序
    7 n( \2 Y2 k% a* @Author: liulianglin' {% a# x$ d& C& i8 t; F2 L
    * @DateTime 2022年9月7日 上午9:12:13
    ) r! ?9 W$ z+ c; g& S/ y/ b* ( J6 b9 _% e9 g' r& g. q6 I8 h$ L
    * 选择排序思想:- J' Z0 J; K& c% d9 X: X6 V/ F4 V
    *         每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    4 z9 z; g! O+ r* L# n*         长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;& y- t* p! Z3 D2 G  {# }
            当进行下一次排序时,范围缩小18 Q/ y$ P7 g. t* W
    */% l9 h. a, f$ W& b# g; Y' n
    public class SelectionSort {$ F' n* S1 v2 M- H- j
            public static void main(String[] args) {
    # e4 L& e4 ?6 j$ q* M; V. O0 p* c                // 待排序数据, t, P  v- `2 P' G
                    int[] arr = {1,3,2,4,7,54,11,34,9};
    " _/ v  D" U/ U6 T% X& f! z! z( W) J% i                . X: O( T+ C! Q  c( o
                    // 记录当前趟数查找到的最大值的数组下标 - I- S6 @. e6 C7 G) q
                    int max;
    1 m) [; N# F7 s3 h: d                8 G; Z6 u9 \: r* q# F3 b
                    // 交换变量: H+ o6 e' C) m1 `& P
                    int temp;
    " n# ^* c+ n" L9 I) c8 _               
    ) d2 S  |1 R* E: A                System.out.println("排序前:" + Arrays.toString(arr));& S7 l4 B3 n) J4 x  _
    ' R! q9 M6 x% z4 o1 x" _$ X
                    // 外层控制循环需要排序的趟数2 r( S8 G3 c2 _" u' D
                    for(int i = 0; i < arr.length - 1; i++) {! c8 h3 |0 _8 g( ]0 Y1 F( w
                            // 每一趟都默认数组第一个元素为最大值* S8 e( P6 g) t) f6 @% m
                            max = 0;
    8 c) |2 u! Z* W$ J& [$ {* q6 q                       
    & N, H( `0 V+ \) M& U9 d0 R                        // 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标" k' v* A9 B+ o; k$ ~: N4 b
                            for (int j = 0; j < arr.length - i; j++) {
    ) ]# K/ f- [: m                                if (arr[j] > arr[max]) {
    4 L0 W) q' n) D2 |7 @" A                                        max = j;
    9 h5 G0 M7 T# |2 H& l: b                                }
    & y6 p+ L8 A/ D  T; J. ^' F9 o. t                        }" w; V$ |7 w- X3 {; R2 i
                            , f% ?; B. `1 A$ k
                            // 将交换变量设置为最大值, 将最大值暂存一下$ E6 C6 k0 B7 T( P( m% T3 @
                            temp = arr[max];0 _8 J& L' o( m. K7 }" v
                            // 将当前最大值设置为当前未排序序列的最后一个元素值* n/ y, Q- x8 r6 t' h1 Q4 W
                            arr[max] = arr[arr.length - 1 - i];
    * _  t; n1 E# G, d' q! Z' e                        // 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换2 c, L# [6 ]) @, ?5 N
                            arr[arr.length - 1 - i] = temp;
    6 J  q. d1 Y) J3 H# ?" s                }
    9 O' \. y* Q7 R4 ]$ K% K2 U* ?               
    * J% r8 E  `! y) n* |                System.out.println("排序后:" + Arrays.toString(arr));
    ) Q$ t* l* U, k, `; b; k* q2 V' J        }( j% b3 E  O( p) F8 M2 W" |- f
    }
    & c, V! M" {$ J; h5 k3 H7 ?, ~2 Y& i8 u% }) c% o7 {0 O/ @+ N+ \
    关键步骤:5 R; i1 f3 q5 ~' P

    3 ?+ N0 l& t8 a% Z2 o9 }, _7 u4 l1. 首先定义两个变量:分别表示最大值标 和 交换变量;& l5 _) t% b; d0 a% k
    5 Q1 e3 }" z. p% c6 I
    2. 通过外层for循环,控制排序的趟数;& Z  I$ V. }* C& p0 A
    " p4 A9 l6 K! ^$ P
    3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;+ y8 [. f6 g* J
    9 o+ b3 S3 \7 E3 z
    4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;* W1 [+ ^1 Y' Z9 J  m5 X

    ) g2 g$ W# s2 ?5.然后将最大值设置为当前未排序序列的最后一个元素;! J4 E' V2 w/ A1 t
    9 m" G+ j9 _/ {  ^3 e- [1 k
    6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素
      r! H0 Y- v- N3 t6 D2 e) h3 d3 q4 y  ]- @) l
    7.至此完成数据交换,继续进行步骤2,直到数据数据有序。
    , T; O2 M0 O1 H3 C# c  r0 z5 b% Q. f1 J
    执行结果
    0 O  z$ Z' ]& J) G7 b% L( t. T% D4 r2 I* u/ Y/ U) G
    ————————————————7 t- ]# f, ?. a/ M6 Q
    版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    2 c- p$ s# F+ X1 G7 L原文链接:https://blog.csdn.net/liulianglin/article/details/126741594
    + a5 t2 `: E/ ?/ H! \, k: J$ j1 e/ G8 U& P, L3 b
    " N5 D9 j+ I8 o( k8 q) 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-4-15 01:16 , Processed in 0.415478 second(s), 51 queries .

    回顶部