QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1870|回复: 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实现); T) g- n+ ~1 P+ |: m3 h: x
    # s/ D3 S8 C( d( L" b
    选择排序概念: W% g( k. o: V2 i4 F, Q' \
            选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike' g& A  G8 ?" r$ `4 K6 _' X

    ( g" D3 s2 y: K. Z" I2 ]* A: T思想
    0 r; F9 l: M: O) l! ^% T, J9 l*     每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    7 K* E- e2 \* Z' C1 s1 {4 p1 ^, P*     长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;. Y$ a: f$ \# \; ]& @- t0 E5 X
    *     当进行下一次排序时,范围缩小1
    - y* k  b/ Q+ }  f3 ^- y) `
    3 d) U& O7 L' ^( [  D代码实现) K! D: ?: G/ }  x7 b
    package com.lll.datastructure.sort;) I1 A  a$ X& j$ j
    ( j3 R9 p! n; c7 w. L! a3 ~
    import java.util.Arrays;
    ( c5 Z! D6 P( B# m5 [) B) B
    0 f) A- F3 b2 q/**
    $ X7 e* X- P  D7 |  \$ k * $ ^0 u7 v8 m; e. Y( z8 k
    * @ClassName: SelectionSort0 t4 O* Z4 r8 D% w" ~" F
    * @Description: 选择排序7 g) u; s/ i7 ?# }- a
    * @Author: liulianglin) F0 H  P8 ~) O
    * @DateTime 2022年9月7日 上午9:12:13
    9 b( b: ?0 V! u- q, `- u7 Q* , `" |4 b- l2 |+ l8 f: P1 c
    * 选择排序思想:0 _7 E/ L3 S& E1 P  M& z
    *         每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    ! A! s2 h6 b! E) l8 r" @& _: g% G*         长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;; T" `) R' {! G
            当进行下一次排序时,范围缩小1: {5 S; n$ P$ v: S/ x$ |! k
    */
    ) w' D, p# Y" V$ o& S# Rpublic class SelectionSort {& {/ J8 ?8 o: _$ p
            public static void main(String[] args) {# |6 _8 J, U( L
                    // 待排序数据4 h  |: x  G7 ]! Q  t: |4 {, }
                    int[] arr = {1,3,2,4,7,54,11,34,9};
    # J3 N" d% v- ?+ l               
    * `+ P. j* G0 X0 N" X4 h6 [                // 记录当前趟数查找到的最大值的数组下标 : V, n2 v" @, Y7 n+ c' s: M
                    int max;
    8 _( j9 F% b6 a6 G+ E               
    5 v# e/ M; n! ^- O! g2 s4 b, z                // 交换变量
    + n( Y$ Q# ~+ G" B7 q) y' t5 O( s1 p                int temp;8 |1 r5 W2 O* z; g8 N# f% O9 }
                    , A: F7 i; @& y% L+ g& e9 [
                    System.out.println("排序前:" + Arrays.toString(arr));: q# r7 b: G% D# F8 E

    : L! U* A$ |9 N2 K2 S                // 外层控制循环需要排序的趟数1 A; f; t8 T& F( k+ \/ ]
                    for(int i = 0; i < arr.length - 1; i++) {4 B5 P6 _* w  t3 R. I8 X
                            // 每一趟都默认数组第一个元素为最大值
    ; W. b: [  A8 ]9 ]                        max = 0;
    4 X0 c# ^0 K/ Z7 ~: R1 p, K; q                        9 c8 I% \# Y/ W$ }
                            // 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标- Q- C! X# P# s- \' M
                            for (int j = 0; j < arr.length - i; j++) {
    2 A- O! I* ~( }8 ~+ Q                                if (arr[j] > arr[max]) {
    ) K# Q. M& }( ?$ i& q9 M. h                                        max = j;" j. `& G( I4 f7 n% x4 a5 L, {
                                    }5 H8 p8 a- d% }4 Y2 N- \. `+ T
                            }$ i9 j  P/ M& U, b
                            / C" \/ ^2 w0 T& U- g: h! D$ R
                            // 将交换变量设置为最大值, 将最大值暂存一下
    6 b' e7 t# n7 B( R" \                        temp = arr[max];. f0 _. H# i! c6 m3 I3 d  T7 u# u
                            // 将当前最大值设置为当前未排序序列的最后一个元素值( u$ w5 a1 R5 t" I. M
                            arr[max] = arr[arr.length - 1 - i];! x# @) Y: z$ A; K
                            // 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换- l8 m* A; w, F
                            arr[arr.length - 1 - i] = temp;
    5 U% h: f0 i9 @" d2 s                }
    * q/ G: _4 P: C1 y+ Q! F4 ?/ F               
    5 C* F6 A) }1 T( }9 i$ |6 x                System.out.println("排序后:" + Arrays.toString(arr));8 k0 q! `* B. z7 ^1 J) a' ^, H
            }
    4 B/ K4 I2 [3 m6 ?  `5 s( V, Q5 O' H}
    " v5 l' q0 o( |2 B( f
    - a/ i* j. o# n9 q  z$ m* x关键步骤:$ R) T' u% b" ~% }+ n2 u" p4 V
    , T$ M& n% r  o: ~' m) p# ?
    1. 首先定义两个变量:分别表示最大值标 和 交换变量;
    # `$ Y5 i4 m  A3 E8 M+ s2 y
    : T, M  @! V# w' b2. 通过外层for循环,控制排序的趟数;1 Y; |8 M0 t9 }

    3 Z- |& O( _5 L# I/ k3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;; x( r% F0 N! j  k' R3 _
    + R- q! l+ w: G
    4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;$ L8 I: |/ r! F, \7 C# D$ J
    ( }7 \* p, v4 w# }" [
    5.然后将最大值设置为当前未排序序列的最后一个元素;
    ; _1 O, k& n" z& y% u6 s# M/ q, A- N# M! w% a- h6 |* V* N4 u
    6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素1 w2 E3 C! W! y* ^: ^

    - C& S" \% y2 T7 P7.至此完成数据交换,继续进行步骤2,直到数据数据有序。+ V( k4 \9 |4 a" Q" P) w0 E! G/ {
    # [+ e2 p8 V" T0 `
    执行结果- t1 z1 F$ b, a2 I. y. B/ c
    7 r) `/ \9 y/ d" o' D4 [0 a) v
    ————————————————. D  ?  j$ m' U
    版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    " q8 _+ m( l. \7 D5 p原文链接:https://blog.csdn.net/liulianglin/article/details/126741594
    & X' m6 ]' q# B4 T+ m: I* M' \; e3 {* Q' R) P0 t' `. `; D5 n
    . W! @" J6 F, F. v4 o# T, s) _
    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-5-26 05:14 , Processed in 0.430621 second(s), 50 queries .

    回顶部