QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1858|回复: 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实现)
    ! {( Y( L1 `3 Z' U
    9 [6 c, J7 m4 }  R选择排序概念
    4 R) e5 ?; d5 R* b/ b8 }" j        选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike, u- g. C( s7 W2 T0 Z6 ~
    9 _# j# e  r  d% \
    思想* |; b, X9 M7 h" s- d1 {& B
    *     每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置( x% d0 G+ K: s# u# P+ t- \
    *     长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;1 V) W- i# P" n6 z& F3 w$ |
    *     当进行下一次排序时,范围缩小18 ]: k) B2 h" r7 t4 Q. p9 u

    8 d% n3 ?' w; M) o. L  d/ f0 L代码实现% e+ @$ a: J7 s1 _6 e1 V" J1 [. g
    package com.lll.datastructure.sort;
    1 L& E7 t6 E4 f: u! D2 T2 C/ D- g/ G4 N3 Y) ^3 [
    import java.util.Arrays;0 t3 [; P) R$ y- s

    . u' A8 F- ]9 g+ h! ]( S3 R/**. M! O! I$ c3 b( C! h# z. c
    *
    . B9 W7 g1 ]$ }" U2 x/ i* @ClassName: SelectionSort! |2 G9 L1 I3 P& f) w6 H2 D) J
    * @Description: 选择排序7 W! j" B) j5 z9 }) K
    * @Author: liulianglin; K3 l) ~% e3 _7 Z
    * @DateTime 2022年9月7日 上午9:12:13
    # K8 k! B5 D- f*
    / t+ x; w8 ^8 e: e  E- u* 选择排序思想:
    % F3 m0 d7 A3 s6 m9 n; M*         每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
      H# m  h  a2 z" ?. R, h2 @/ H*         长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;1 h& X6 e# O/ a. {( {
            当进行下一次排序时,范围缩小14 p9 U6 ]7 Z0 K4 G+ [$ J
    */
    6 i& S, k3 |$ o9 z$ hpublic class SelectionSort {
    ! w2 c/ I( W3 N/ h1 _& T9 T9 Q8 P3 r        public static void main(String[] args) {
    ( r8 o, [* T' M- F2 D1 Y' j0 D                // 待排序数据
    8 V9 h, ^+ }( z                int[] arr = {1,3,2,4,7,54,11,34,9}; ' |8 ?: ~# i) @. G# f3 d& q
                   
    % o8 l( S# ]# ?' s5 D                // 记录当前趟数查找到的最大值的数组下标 . n5 d/ |8 U1 Q( t5 a+ V0 c1 V6 [$ s
                    int max;  i; Q. \1 b6 x( ?
                   
    7 q: }# i4 n  r9 l* u; N# d; |$ ^1 F                // 交换变量
    : j& c0 _2 ?+ x                int temp;/ n/ ]1 p' V6 Q" }  u1 D
                    " @, d: L) _# `: E# {
                    System.out.println("排序前:" + Arrays.toString(arr));) O: p. \+ x* i! L% z* r
      j$ B8 @7 h1 u. }0 |8 N/ r
                    // 外层控制循环需要排序的趟数  @2 x# p1 S2 c. L! @: x- C
                    for(int i = 0; i < arr.length - 1; i++) {
    " v; q6 D$ A3 s9 y7 N& N                        // 每一趟都默认数组第一个元素为最大值. P7 M; ^7 B$ U
                            max = 0;
    2 F8 a4 F3 a" t3 k0 F$ X                       
    4 j, m( B' ~  t5 O4 G6 S7 k  C                        // 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标
    $ Y+ v, N7 E/ n# g5 d1 U4 G1 m                        for (int j = 0; j < arr.length - i; j++) {( X% @7 S5 `8 Q+ m) r/ r. p
                                    if (arr[j] > arr[max]) {) X. y8 h9 N9 E) h
                                            max = j;
    ' u/ r: ~8 c, Q+ [3 j                                }
    ! D: k8 J* R: j7 X4 h6 ]4 T, a                        }
    % o, D! l, l' V/ b, d. C. d                       
    2 a% {! f! i2 v4 F0 ?$ z9 p2 l; F                        // 将交换变量设置为最大值, 将最大值暂存一下
    6 ]  \  B" V* ~3 L                        temp = arr[max];& E) P& {0 G4 W, t6 ?/ p
                            // 将当前最大值设置为当前未排序序列的最后一个元素值$ _: z8 L4 k' ?
                            arr[max] = arr[arr.length - 1 - i];
    # E. x: H- |7 N% Y0 S                        // 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换
    : `  V1 i1 C3 B9 j* k                        arr[arr.length - 1 - i] = temp;* j# U3 T7 F5 `; o" P+ G& @
                    }8 ^# }5 D" v7 H
                    ! v3 T5 ]/ p9 v- l+ Q
                    System.out.println("排序后:" + Arrays.toString(arr));( R8 y, n7 u' C: p+ c
            }
    . h$ s0 i  E5 C: {}
    ) E, i( N) `* h1 _1 W
    / x5 h; b; z! I2 ~* B关键步骤:
    7 N) J8 P1 a4 w& r0 T
    ' h( Y: l( N( R" g1. 首先定义两个变量:分别表示最大值标 和 交换变量;
    , R/ Q  J; w0 v/ O6 x! w% v9 f, {! d5 Y- |3 _0 m5 ?* r0 g
    2. 通过外层for循环,控制排序的趟数;; c4 m$ N- x9 Q& \6 i& m
    , ]' x& }' h" K5 b. W
    3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;
    ' e" o# d5 w2 |( @1 s- W6 q$ i( y! S" J% Y
    4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;6 I* }* C% D0 g+ Q
    , Y6 a  _5 R9 V. V
    5.然后将最大值设置为当前未排序序列的最后一个元素;% C! W; [- ~3 i" r* @1 ?

    5 {% d6 {' p/ H8 K5 G2 ?6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素1 u& b3 d5 U, X' Q3 ^% V" s2 o8 @! ]
    ( r6 D% q! h' z+ D7 j1 M
    7.至此完成数据交换,继续进行步骤2,直到数据数据有序。+ U2 O% z( J# ^
    $ r6 _: P/ B8 w6 _/ U# T
    执行结果
    * {' O2 T  p, L! M% N9 E  n7 P& n4 F* D; n2 B
    ————————————————
    $ H2 W* f; m& r& p6 I4 W版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# M& o3 Y: ]' {
    原文链接:https://blog.csdn.net/liulianglin/article/details/126741594
    & i4 Q; U; x, S& |- m! y9 X# B  v: E
    ' g$ j# D$ r8 l# L. J+ ?
    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-16 05:15 , Processed in 0.434868 second(s), 51 queries .

    回顶部