QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1850|回复: 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实现)
    ! w0 }  S. W$ c& U1 H7 ~& \" g- `% J0 t
    + T  T% }# s: N7 G) V4 }2 L$ U选择排序概念
    3 f& M0 F! Y2 u  Y* h# U: `: B* q        选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike1 V* E* U2 l5 Y* t- x7 z

    " V) O0 K' B: W/ x+ K, H/ J! Y3 O% `思想, k1 P7 G( X$ n
    *     每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置% s$ X1 I' ]% T; ?5 u0 S7 e
    *     长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
    1 j2 w# T7 f  x5 ]* q7 q" u*     当进行下一次排序时,范围缩小1
    ) z+ s8 k: [2 B) w; u; P* O0 e) X) K0 R* B3 m: N* |
    代码实现
    $ i) |) k! L+ K7 ?4 @8 R" ppackage com.lll.datastructure.sort;! a# I$ ]  C! q
    ! Q1 E3 I4 c, M; _
    import java.util.Arrays;
    $ T6 w6 I. b/ U; ?9 E6 z5 x' |; b6 ?+ V& \6 n
    /**0 L6 x. E) _+ J- U5 X
    * 7 H! q; p" C3 r9 b, @9 d- s/ `& {
    * @ClassName: SelectionSort9 D$ A) W" E3 ]
    * @Description: 选择排序
    3 t5 x/ |. ]) l8 y2 }7 f: R* @Author: liulianglin
    / X% @5 E. W% H( c( w* @DateTime 2022年9月7日 上午9:12:13
    ' V/ E  d8 W9 k: D. O3 k+ C1 m9 [*
    - K. Z- h& U! B+ \! _/ q& T* 选择排序思想:* ^3 q; ]2 m* c8 {+ T' V1 L5 `
    *         每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置: p. O, ]% J" O- h. R4 ?
    *         长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
    0 a& R0 V' z! z( Q: x# [; Z        当进行下一次排序时,范围缩小1
    ( j; g* j- ]; q# ?* j+ Y- v */: H8 Y- ]* n: i9 B
    public class SelectionSort {6 n! _8 w0 I: k$ T; W
            public static void main(String[] args) {
    . R: F$ U' A) r5 ~  J( i  K+ ]* E                // 待排序数据: M' q( n) `  k  a$ M
                    int[] arr = {1,3,2,4,7,54,11,34,9}; # Y& H7 S4 t8 h+ c# q2 Q$ }! @# N
                    + \" j. q6 [+ W2 X; O" Y
                    // 记录当前趟数查找到的最大值的数组下标 1 O: h* p$ r) W( I- S
                    int max;0 u  H6 w$ g; e7 c
                    1 N, u# L1 u4 a( F0 I
                    // 交换变量
    & x0 |" W# N9 T$ d+ b0 p                int temp;
    1 E+ W( P2 h1 M4 p8 q: W                " ]0 T* ~5 l6 u2 o4 A
                    System.out.println("排序前:" + Arrays.toString(arr));
    1 Y8 M/ Y& Y$ ?3 `9 c- b8 O6 w2 N, M. y$ X7 D
                    // 外层控制循环需要排序的趟数
      `3 @0 y+ b0 T- _) X6 x                for(int i = 0; i < arr.length - 1; i++) {; l- n! k- H6 F( b3 h' G6 X
                            // 每一趟都默认数组第一个元素为最大值
    4 r( u$ C$ G& e! L$ v+ X+ q                        max = 0;
    : J  o- T3 p% p$ p) X+ c) T6 d                        / O0 @/ ^* m7 A$ v
                            // 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标$ k* S; F/ J  d( @
                            for (int j = 0; j < arr.length - i; j++) {2 H0 \3 Z+ ]  z) |: x  g
                                    if (arr[j] > arr[max]) {
    * U1 E9 Z- {5 T6 _                                        max = j;. s: ^/ B8 v2 [
                                    }% q  h: }8 t: I; }
                            }; K5 v! }1 r) C. U( i% [
                           
    4 V) O- x+ v) E  b" B                        // 将交换变量设置为最大值, 将最大值暂存一下
    , i" a2 P% Z: k% M                        temp = arr[max];
    0 v/ D8 Z- u4 D5 n8 e                        // 将当前最大值设置为当前未排序序列的最后一个元素值: G: x2 s! j  j& W  f, f
                            arr[max] = arr[arr.length - 1 - i];
    4 [1 J  E% M* V$ B                        // 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换, m- O3 y2 p9 j7 n6 H0 E
                            arr[arr.length - 1 - i] = temp;7 o0 o7 G, l/ s) A" ?  \3 w3 I8 ^  t( W
                    }8 l8 n6 p' y; B* R" C* e
                   
    $ P, E2 V) L. E1 h1 L9 d                System.out.println("排序后:" + Arrays.toString(arr));1 @6 ^. ~4 O+ |2 l
            }; q3 S0 t- S, W1 [5 A% J. ^" Y
    }# p- e" k% w' k4 Z. U# B( Y& l
    ( x# x5 C7 L' w/ j
    关键步骤:
    8 Y6 _( |6 {, q! |7 `; Q7 @. m1 d# n5 I" C
    1. 首先定义两个变量:分别表示最大值标 和 交换变量;
    ! ~; _) e/ Y9 q- e7 [; W
    ' Q6 [  P) B9 z- D1 v2. 通过外层for循环,控制排序的趟数;, z; d* y- t, l: O# Z

    6 I! Y3 G) @# o" N3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;
    % D( \) N$ T+ t/ P4 p2 n3 ]7 H3 w4 j; ?2 T+ U9 T) ~) {; I
    4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;+ z- N+ v0 \' {/ j3 N: {
    : h* m7 z0 Y7 q7 g5 O% _
    5.然后将最大值设置为当前未排序序列的最后一个元素;$ L: g3 m4 `9 N5 X
    0 _- Z! J4 R6 v$ d9 I9 o
    6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素' P5 P* z9 m6 H7 j/ E5 b5 a
    ; `4 y$ C6 b, h) e( i9 @6 Z7 l
    7.至此完成数据交换,继续进行步骤2,直到数据数据有序。
    % m& d) O  v6 w9 \8 x; o' ]% C4 k% U' i% W: A9 X( ]
    执行结果! T2 C" i% x' \5 K0 o7 y

    4 F; j* P" K& \! P( v————————————————3 \3 O4 t0 M5 ?
    版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% @* L0 X* M2 ?" [. k# K2 d) v( }' I
    原文链接:https://blog.csdn.net/liulianglin/article/details/126741594
    - u$ G" v' j$ r
    ) o8 J0 q8 ?3 E" |
    9 O. t# |" S& V# e& v+ j6 t- J/ u
    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 14:53 , Processed in 0.361160 second(s), 51 queries .

    回顶部