QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1900|回复: 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实现)2 }* q4 Z' c( k1 Y( Z
    ' {* @: H$ z- u- B% w
    选择排序概念: q3 x- }) V' ?3 `
            选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike# }8 N& ?4 h% t1 v
      G0 {% R2 I& L1 ~: g, E2 R
    思想
    ' g& `  `7 a* ^8 U- |. m*     每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    . z: p  w3 g; }" Q% d*     长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;, l- ?0 J( A* H( m- B
    *     当进行下一次排序时,范围缩小1
    9 F2 U* C7 k, J$ I+ ~" z. D- S
    ' A; v. `7 m/ o4 |) t9 b代码实现
    # ?( m0 |: @$ A8 @- x  w. W6 H% Vpackage com.lll.datastructure.sort;8 A( [+ [5 _1 h3 @# I6 x
    " t6 u4 ]* p! b6 n
    import java.util.Arrays;
    & h% @8 r7 x* y" y: l
    : o- c4 b$ M3 }4 f5 s: B+ C/**
    ' C# p# ~: a9 G, y/ h$ X" D * $ D0 J) ^" O6 @: X; g: T
    * @ClassName: SelectionSort
    9 D6 _  z$ G* B' p* z* @Description: 选择排序) z' p. D* F4 L- N. {
    * @Author: liulianglin' I4 I1 z2 O3 p7 V
    * @DateTime 2022年9月7日 上午9:12:13. @* q7 [7 G+ K# J$ G
    * 4 C. u( ]' T7 U0 v9 ~" _9 _
    * 选择排序思想:9 R& l' k' v- L! Y, H4 }
    *         每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置$ T2 _" D& [* |; z5 h
    *         长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
    2 @3 {: R0 i& K7 @/ o        当进行下一次排序时,范围缩小1
    , w; e' D* |1 x* m4 H */
    & ?$ B! E0 q: R# r& bpublic class SelectionSort {$ M1 ]& d! |1 j" G3 i, Y$ P, o
            public static void main(String[] args) {
    - R% w/ F! B5 x$ N( g1 R7 I1 @& g                // 待排序数据* t, V. b' k* U$ H- q
                    int[] arr = {1,3,2,4,7,54,11,34,9};
    * m$ V: T/ X4 K- U8 d6 [, J               
    ) k) A& _( s6 t+ u" Q                // 记录当前趟数查找到的最大值的数组下标
    # `3 a4 G# N* Q. L' Y                int max;2 S1 G' P# [* W2 h. G6 k  j+ k& ]
                   
    . K4 M3 m5 p* s, }; Z1 B  o                // 交换变量7 b2 d3 k( z+ w9 c* a% y
                    int temp;* t, O; F' V  z# H
                   
      ~" ?( N! J  W* p                System.out.println("排序前:" + Arrays.toString(arr));
    ) I2 d8 J; b- Q2 `! g3 X7 _) i0 ^, c; Q3 x
                    // 外层控制循环需要排序的趟数3 P0 k$ `4 m. I) {' S
                    for(int i = 0; i < arr.length - 1; i++) {- [1 a1 h+ w  e2 b8 s. D- l9 k  V' J7 C
                            // 每一趟都默认数组第一个元素为最大值' C3 i0 g) I7 h
                            max = 0;6 D; ]4 }- w, B! H
                           
    : A7 s2 u; J8 h8 K% V, K4 {                        // 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标
    . u* w  M" x+ o8 T; ~/ |9 K3 E# Z' A                        for (int j = 0; j < arr.length - i; j++) {' g7 a0 I4 l3 N6 n( C& h8 M- x+ K. u$ ~
                                    if (arr[j] > arr[max]) {
    * z' l9 F- w/ _2 g: r                                        max = j;
    5 J% I5 w2 _! q/ \5 u                                }
    - w" l2 |- X$ a- a# Z2 Q                        }
    : w) Q/ i1 j3 c- n( Y/ T                       
      V* |' h0 f0 ~4 H7 Y( b7 E& S0 a* _7 H                        // 将交换变量设置为最大值, 将最大值暂存一下; \6 b) [! T- f$ C- V0 T
                            temp = arr[max];
    : v4 ^( v- A- N" a7 y                        // 将当前最大值设置为当前未排序序列的最后一个元素值
    3 l8 o2 I& i7 h3 i6 ~                        arr[max] = arr[arr.length - 1 - i];. d4 N) D- T% a; K
                            // 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换# _. D+ ~0 l( |3 G
                            arr[arr.length - 1 - i] = temp;
    % d. _3 K% v- h* j                }
    . w4 F/ M6 ~# T' a7 {               
    2 S; M* e- j/ \' }! E: |                System.out.println("排序后:" + Arrays.toString(arr));
    / I* a+ {2 O4 \& s  V3 d        }/ N' T1 c8 b1 ?1 j7 `
    }, W) t2 r0 ]& C) }7 W

    : R6 p& L2 c5 f: x6 p关键步骤:
    7 v5 Y! M3 V& T+ P
    4 V6 m& b* r+ a5 P" }& D: {6 j1. 首先定义两个变量:分别表示最大值标 和 交换变量;
    & G" ?' Y5 q$ N: B3 q
      M( e1 L# o" N: T* g; d2 X/ V2. 通过外层for循环,控制排序的趟数;
    3 n  {/ a0 q$ x; d" N& q- \5 Y
    3 U2 J/ _! T7 j  i) y3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;
    9 h6 M. C9 e  P/ X* Y7 n! C& |- x2 \6 l
    4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;2 S9 q. v1 m1 Z( P/ ^- Z( @
    & C3 [/ O; a$ m, o3 @
    5.然后将最大值设置为当前未排序序列的最后一个元素;# K2 Y6 W) h: O' B6 j- r

    3 \" ^0 E5 K2 U8 E7 U: _6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素
    9 d9 g4 y) y4 ]% [* a1 E- z/ Y% P' Q5 ]9 A$ c( K
    7.至此完成数据交换,继续进行步骤2,直到数据数据有序。
    $ g6 \: A- }; l% Z9 k
      N- Y6 |, I7 t4 [  n4 @, W 执行结果
    # I' Q2 v; w- x. @2 m7 J8 T) e5 v# @% g. I
    ————————————————
    # F4 l! ], W& y7 U8 S. m$ u& g版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    : S( t. }! _3 F% f$ {原文链接:https://blog.csdn.net/liulianglin/article/details/126741594* a( \9 ?) V+ i( ~) P

    " f8 f5 G4 U8 G$ W0 }; I
    # `0 w) b+ ^" Q  i  F
    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-30 22:31 , Processed in 0.435807 second(s), 51 queries .

    回顶部