QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1919|回复: 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实现)( D1 i7 i9 k5 l# P. O
    ! O$ v6 d% s* o6 V/ C4 o
    选择排序概念
    ! d& @! e) l+ t$ D  R        选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike/ P. L  \$ Q) M4 ~/ N% {
    3 m8 [5 n! r& T
    思想
    ! _) Z3 v' U8 _& d*     每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    0 ~0 m2 M9 s$ s, ^( A0 g5 o*     长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
    0 U# ^3 a) C$ f8 M. ]*     当进行下一次排序时,范围缩小1
    ( {. ?; Y* l& @! N% @0 M4 ~$ t* P  P# j2 `: H2 r1 }% ~3 B7 i
    代码实现0 P" b6 X2 j4 x' @% c, N6 Y1 M/ b
    package com.lll.datastructure.sort;* x, s+ ^% l7 P" c6 b6 F8 h

    % L7 e8 N4 @( u0 c% Qimport java.util.Arrays;
    ' C3 O) n& B% t3 C: h. [/ O' @& w2 o; \$ b: e) F" I3 ?
    /**) j5 {5 C$ X3 a2 \2 k9 E
    *
    & |7 b2 j$ J, C: i/ d, y; J# H* @ClassName: SelectionSort: B* U  N* c5 s7 e0 V* ~
    * @Description: 选择排序
    ; m( }, r8 I0 q) s5 J  h5 [* @Author: liulianglin
    7 Y3 A- j- m' e' S2 f7 {, _( ~* @DateTime 2022年9月7日 上午9:12:13
    ) N  @/ `3 N9 J: ^) a& E*
    : ]# ?  G) ^+ J- ?* i* 选择排序思想:
    1 L9 R! C8 s+ x1 `* Z*         每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    0 o  w: \( _( o5 s2 j9 g2 j*         长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;4 X/ n) n4 y6 a6 W* {5 A' [9 r5 }
            当进行下一次排序时,范围缩小1! \* k/ ^; l# _
    */& p& _/ B, d$ h) b: \
    public class SelectionSort {
    " L: l3 g/ G6 _0 _5 _, ]; w7 L        public static void main(String[] args) {6 D. k4 Y. b& K  A$ U1 ?
                    // 待排序数据& f% X/ a, _: [6 f! Q# q6 r2 e' Z
                    int[] arr = {1,3,2,4,7,54,11,34,9}; ! L' S" G" O  v# M' E
                    0 j* @* A; T- F* W
                    // 记录当前趟数查找到的最大值的数组下标 ( v" H* ]$ k* \
                    int max;/ E7 \# L5 V0 s- B( L6 Y3 b! }
                      ?3 v/ j, i. h- @  ?
                    // 交换变量
    # b9 @! D1 N# z                int temp;
    . N! @9 J0 i) |, e  k2 u' n               
    0 j, A4 V. q, E4 M- u. S                System.out.println("排序前:" + Arrays.toString(arr));* h' m, q$ C3 y
    6 r% c) d' T+ {; p  U- c
                    // 外层控制循环需要排序的趟数; P* U2 g/ ~  r5 ]! ]0 c% g1 I- F
                    for(int i = 0; i < arr.length - 1; i++) {6 m; R) Q* B; K5 \) W7 P
                            // 每一趟都默认数组第一个元素为最大值
    8 S/ y6 \# Q' \7 A. c                        max = 0;
    + O% z- H- e- A" _' M' c                       
    * K* P! L/ ]1 s# {( k                        // 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标
    2 {3 ]: C$ k! ^- E* L6 P                        for (int j = 0; j < arr.length - i; j++) {
    ( o: s) B3 c, h8 n6 ]" u1 x, C6 X                                if (arr[j] > arr[max]) {
    3 X' H7 D: k; T                                        max = j;: q3 ]7 k. O$ f! b2 |* w
                                    }/ v2 D- B7 a$ `' @- p% E: B: L
                            }& Z4 P7 O3 k& d4 D
                           
    : {) s- b# A& ?% i8 E9 w7 M7 O. E                        // 将交换变量设置为最大值, 将最大值暂存一下
    3 {# V) Y; S$ I: l                        temp = arr[max];
    % |  J+ h( z" K2 j, {+ t                        // 将当前最大值设置为当前未排序序列的最后一个元素值. O3 X1 S3 n+ i  M1 X4 W
                            arr[max] = arr[arr.length - 1 - i];
    $ R/ w% ?9 J5 d                        // 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换, j, x/ o* U, z. y& T8 d4 C
                            arr[arr.length - 1 - i] = temp;
    6 g& \0 L, l5 w8 y* K& m+ ?* I9 F                }% B9 b" G; S$ d
                   
    ! S' W9 ^2 T6 _/ C  H; I+ H3 b                System.out.println("排序后:" + Arrays.toString(arr));
    7 U+ E  Z/ V2 b        }
    / }, O% D, G$ I/ W}% ~& a  A) x; ^7 ]
    ) u1 `! W7 s+ l* p
    关键步骤:; _3 E8 i2 G4 O! Y: G# c+ o3 g3 b
    # ~) k6 F7 ?. ?3 I% X4 p
    1. 首先定义两个变量:分别表示最大值标 和 交换变量;; `' t4 T' Q& p6 r0 a
    . F3 Y3 |7 e1 {9 `; `/ u8 B7 I
    2. 通过外层for循环,控制排序的趟数;
    + e8 I  `# i- Z) \
    4 Y5 ?1 k& Y9 m" F" b. _8 B' g3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;
    ' {# g; K# m# c5 p/ F+ Q' p) C6 S" `4 C' c8 m# o2 Q
    4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;
    5 S% T  v5 N! g( O6 n- P% Z6 w8 f- h) k, w% Y" X1 d
    5.然后将最大值设置为当前未排序序列的最后一个元素;/ |: X& E0 y3 b* h9 w5 Z# O% d; A
    $ `2 p9 ~; K' i. w6 \$ q" o, C
    6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素6 k* O" I" p1 u( P7 C" B$ m6 e
      s0 G5 A) ?+ p5 V8 t3 h  T# \
    7.至此完成数据交换,继续进行步骤2,直到数据数据有序。
    8 W% D# p: a" d  L- B' L, j9 X. g9 P. j$ ~3 x) x. ?: ~! q
    执行结果
    + I6 o0 z. P" ^& C0 z/ \4 Z0 P9 F/ l3 G: d$ \% t
    ————————————————
    / t0 Z5 e% B) h) q版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    4 B; g8 u( U$ y原文链接:https://blog.csdn.net/liulianglin/article/details/126741594+ @' `$ X! F& E, Q6 |) v6 p
    1 ?( V+ z0 I3 u, T3 d
    " Y) `& V9 f4 q: A5 }5 ~
    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-9-13 20:13 , Processed in 0.451625 second(s), 56 queries .

    回顶部