QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1885|回复: 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实现)# j9 E3 r4 M3 Z) p! U

    ) d3 e/ p4 Y+ v选择排序概念# a6 N' o" ^4 F! v+ D6 a8 o
            选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike" n( S* W* W" V/ b$ m5 p
    ; N, \# K8 v4 P
    思想8 @/ c5 y0 C  p) d1 j5 e$ c
    *     每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    - B* G" l0 C/ e$ s*     长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;$ f; \, h2 z" f+ V2 n
    *     当进行下一次排序时,范围缩小1
    ; T0 [: t2 G0 T! o4 V
    - {, l, _7 ~& q, d+ P6 d代码实现
    7 v) D0 T# b* [1 s# Bpackage com.lll.datastructure.sort;/ _; f5 M+ Y- [5 G( N

    0 b) {2 @( x2 e8 @& C, Q$ a1 qimport java.util.Arrays;$ ]: G- G1 u; R) o/ p! @% o6 D( `+ P

    ( r3 h( h( F4 A7 i3 n/**
    / X% e- ~- G, m * 1 p! f  r: Z  }2 V% m1 t) J* F
    * @ClassName: SelectionSort
    , u; l) n& ]: a, S7 r: D8 V* R* @Description: 选择排序$ I6 v9 W/ B) W- M; j  b
    * @Author: liulianglin
    6 ?; E( i& s% u* @DateTime 2022年9月7日 上午9:12:13. C/ w4 h1 U0 u4 I. b1 X
    * 2 `  u9 l/ D& |/ s/ w: j+ g; h
    * 选择排序思想:
    # z5 m+ R& K% ^% F5 A. Z3 Z*         每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置( W1 o7 G9 a3 C8 X) [) ~4 N
    *         长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
    8 t& j3 ~3 a. s7 M' y" M        当进行下一次排序时,范围缩小1
    $ ~, {$ B( \/ ~6 K */# K* r, A, D6 P% I7 a
    public class SelectionSort {# U  v3 f; N0 N# i; `( H$ j+ T
            public static void main(String[] args) {* _. f' Q/ N! s/ H
                    // 待排序数据/ J3 r3 W' d8 J
                    int[] arr = {1,3,2,4,7,54,11,34,9};
    2 |4 |& d. g/ p3 ^# _% h               
    5 v* A; T" O" R# o& E$ c* X                // 记录当前趟数查找到的最大值的数组下标
    ' w: S. E; _6 B' w& X; G) O" P9 Y                int max;& O1 w$ s* l- H. L9 I. P
                   
    , l6 d9 ]  `$ I                // 交换变量8 k* x' u  E# F  s+ S' o4 z
                    int temp;! J1 L9 v1 [+ K+ X5 _( j+ \! f
                    6 i1 \: _% W1 Z3 o8 b0 T) e5 H
                    System.out.println("排序前:" + Arrays.toString(arr));
    9 S' ^" t2 Y; v  ^3 E! s* a& w7 ?5 E  f2 I
                    // 外层控制循环需要排序的趟数
    1 L  h8 }  z9 `; B" l# d7 b                for(int i = 0; i < arr.length - 1; i++) {
    * a: I, p" b5 t7 [7 H0 E2 u                        // 每一趟都默认数组第一个元素为最大值
    ' T' n- Q$ P0 Q8 f+ v                        max = 0;' j: T  y8 t% r3 b
                            0 X7 R  {4 Q& P+ G
                            // 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标- e' Q0 M) H6 a6 W
                            for (int j = 0; j < arr.length - i; j++) {' \  J/ B1 M7 d( }9 P) g
                                    if (arr[j] > arr[max]) {- S* E# V! ~  d& ^
                                            max = j;
    ) n. u! z/ t6 L. T                                }9 [. n1 ~9 u: c( J  M9 T8 l; W$ k
                            }- d  k& ?7 m6 b' {' h8 ]
                            / \) l: E: r/ I& ]; g1 w+ r4 g: Z
                            // 将交换变量设置为最大值, 将最大值暂存一下- l1 m: W0 s" }; E& w* q  u: M( C0 \& w
                            temp = arr[max];
    ) w# K; C9 k+ L$ w  ~0 {+ i# G                        // 将当前最大值设置为当前未排序序列的最后一个元素值7 f( c, k: }. U& g" p  r4 q  _
                            arr[max] = arr[arr.length - 1 - i];' p, ]0 }9 o8 k2 X, }9 C6 J/ w# T* T
                            // 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换
    ( @4 Q  d* I4 |( q) M$ t                        arr[arr.length - 1 - i] = temp;. m, Y& x. Z4 i+ Z( h: h# O5 h
                    }
    # Q4 S% P; m: X               
    / a* Y* ]- O( K  y( p1 E, Q+ H! {                System.out.println("排序后:" + Arrays.toString(arr));
    . X5 c) e7 s/ U" N5 z. u8 V. M        }0 ^: Q) e" a& N6 i
    }1 z5 l+ m- p# t% X7 M8 b! d6 z' u
    ! S% _; M0 g* ~% H0 I
    关键步骤:& X7 [" p. P! C6 _' T* i
    # ?' Q9 [' [; ]2 P3 D7 J# P0 b
    1. 首先定义两个变量:分别表示最大值标 和 交换变量;
    : D9 m% K5 y. F3 f  h7 r: J7 U( Z8 f' L2 e; z7 x
    2. 通过外层for循环,控制排序的趟数;
    ! U$ t. N/ O# N) ^. s7 V7 x9 P$ Q7 t( O% q% T% F* ~
    3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;( ?0 ^+ x0 m0 C

    $ k# g6 W  `( L" ~' N$ u! ~( L4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;
    $ j1 i0 u' S0 M* O: z  M6 n2 i" w0 x9 f2 q4 k3 {8 t4 f
    5.然后将最大值设置为当前未排序序列的最后一个元素;: `  W5 {, P& n( p4 g

    : _" @4 l' d" H# T5 |4 E$ O6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素8 p, `" }* ^/ Z" Z- g' V

    " s: L% K) B7 @5 E+ H7.至此完成数据交换,继续进行步骤2,直到数据数据有序。  i6 N, s; S: e1 [' e" [/ [

    , T9 l/ p4 w: i3 u6 l# V 执行结果& v+ d& k' L) m+ r

    % K+ f$ ]9 K! C/ @6 ]————————————————( m# g  M2 I+ ^* l3 ^
    版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。5 o0 r; ~* s( f; V
    原文链接:https://blog.csdn.net/liulianglin/article/details/126741594
    $ m% |( w& b( D8 D2 X4 Y. ^
    5 d* H' k2 P9 V* W( w
      y  j( g. S4 P
    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-6-15 07:29 , Processed in 0.392362 second(s), 51 queries .

    回顶部