QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1852|回复: 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实现)0 j' b, u6 r! |+ {5 {& ^  W
    . o! k8 g7 ~0 F: k! m
    选择排序概念4 L' t( K5 S3 F
            选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike
    / @( P8 X8 {  h& f- t6 u5 E6 }$ T9 @0 ~
    思想
    1 ^" `2 q+ u8 V$ V( A5 }*     每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    1 j9 W" h# ]( x' E9 N$ E*     长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
    * z9 L+ S! K6 z" l! X9 o% K*     当进行下一次排序时,范围缩小1
    ) R& e, }9 {8 `& |. m7 L
    # D) P; f) K1 E8 ?) K% B代码实现- U; q! z* Y- `1 d
    package com.lll.datastructure.sort;; t1 H! y0 ?$ X$ G8 k# K' }/ @
    3 _  q$ Z+ m% c# F" @, G
    import java.util.Arrays;
    ( J1 R! C" N! V, x/ e
    0 M) c" o3 u7 J6 X9 P& n. H/**
    ; k  `) y0 G1 ]% }2 a *
    - i4 w4 `  X1 D/ K, J2 |* @ClassName: SelectionSort
    1 T% B1 j% G/ X( V* @Description: 选择排序- P; j7 ~* ~) Q1 H" p6 ^$ |
    * @Author: liulianglin
    % `& U, H0 W, d: Q* @DateTime 2022年9月7日 上午9:12:13  {0 k: F8 f, y) r7 D; ]6 L/ K
    * 9 \& |% L8 Q$ Q+ S5 r  A- g, i1 a" |5 G
    * 选择排序思想:8 j% o9 D7 `; O# x! J, B9 j8 r
    *         每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    8 P: p* x7 v9 U' u*         长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;* N3 F: x( ?  d3 Z
            当进行下一次排序时,范围缩小1
    ) q3 i) u% Y% |& w  k */
    - H+ G/ C/ C/ c( O2 vpublic class SelectionSort {" l. u& k" e9 v$ }
            public static void main(String[] args) {+ E$ r9 x. H4 V; y5 e, E
                    // 待排序数据7 G0 a* M7 u6 n4 @& o: r" q3 A$ w2 |1 ?/ I
                    int[] arr = {1,3,2,4,7,54,11,34,9}; & U: o; i( N% j. I
                    - E0 r8 ]5 d4 ^) q$ s% u  |
                    // 记录当前趟数查找到的最大值的数组下标   r" P. y$ y4 ~9 \9 u0 X3 w: y$ K
                    int max;
    ! s8 v- ~, ?) F1 S% u, Q. g               
    5 j) ^: z' V0 G                // 交换变量$ F/ M. ?4 r' G
                    int temp;
    5 ]9 N# V* p/ K5 |5 ?" l                : ~) D2 ]; R. B# C; v6 I
                    System.out.println("排序前:" + Arrays.toString(arr));
    5 V) |) a4 n6 Z4 J
    9 ?5 C& w) N. {- R, r; x& g& V                // 外层控制循环需要排序的趟数
    6 n* \6 L& I" u( Q. t1 C                for(int i = 0; i < arr.length - 1; i++) {
    9 B( ~; p( A7 M- y4 d2 |                        // 每一趟都默认数组第一个元素为最大值: b/ R& U! g% r3 j$ l
                            max = 0;
    ) G0 Y) L. h3 V0 Y) U# g+ w1 M& l& t                       
    ' z/ V1 J$ C: O                        // 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标
    / E0 }- {4 d% T0 M0 s                        for (int j = 0; j < arr.length - i; j++) {1 ]; }% Q2 r% `$ G# n
                                    if (arr[j] > arr[max]) {
    / U) C/ _! q# E" o7 B7 q' s                                        max = j;
    0 n) i2 @# Y; b                                }
    + `2 x; y, g+ x( T+ Z% f                        }
    ' y" T$ B7 ]0 H7 @                       
    - a& H; y2 m; z/ `6 n( F$ k                        // 将交换变量设置为最大值, 将最大值暂存一下; l# E! f+ }, O  F/ d7 i; N
                            temp = arr[max];
    8 V0 r# z( Y7 m6 n% `                        // 将当前最大值设置为当前未排序序列的最后一个元素值
      Q' ~) H' c! m- G% }2 i; \( J9 _% m                        arr[max] = arr[arr.length - 1 - i];
      ?, ?' D5 _# Y+ B/ X$ q5 y; M                        // 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换
    6 e3 U+ F: P3 X2 X; r7 s5 o                        arr[arr.length - 1 - i] = temp;6 ^- h) @' H' w. L5 c$ a
                    }
      d1 D% x( q" O# P5 z" q, N- c" r               
    + h+ @: J6 A+ ?4 Q4 O) E1 H                System.out.println("排序后:" + Arrays.toString(arr));
      v5 f: {- e, S3 o5 U- s* W6 F        }
    3 _% H4 Q5 v. H3 Y& G2 @; ]}
    9 s+ r0 m7 z# S8 ?% N, F9 Z
    + A3 c6 U: k- g' S. w  x# h关键步骤:
    - [  A  N- t4 E% C
    ; p# h: p# J1 T- ^1. 首先定义两个变量:分别表示最大值标 和 交换变量;
    ' A# P) v: W& E3 X
    : o4 V: W, T: s$ F# e) J6 e  s2. 通过外层for循环,控制排序的趟数;
    : |/ }4 L/ }2 |: u2 u& p; e0 M" f) {$ D* I5 ~
    3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;
    4 m$ Q9 A* {- h$ y6 Y2 ?  n4 _0 S' Q) Y: B2 y
    4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;
    ( q6 f& ?$ w5 N, r) N, G5 `
    5 V$ m7 y# t! K3 @# ]9 e3 f5.然后将最大值设置为当前未排序序列的最后一个元素;
    $ F( ^5 S% Y% u, n9 K( W' }6 A7 Y, X7 `' }' V. p- h
    6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素
    7 u; \4 f! s! s5 E0 z# }
    $ I+ Z7 _! Z( \: r3 n7.至此完成数据交换,继续进行步骤2,直到数据数据有序。3 e% m& A! E8 t- {, F4 X  j& w

    9 l4 m5 e6 O4 [2 |! h) p. l+ s 执行结果% `; a( ]" ^0 O

    * F- g4 E7 o0 }. s————————————————
    + ]8 F2 n& O0 P/ u' h+ J版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    $ c+ r1 }* b7 ^原文链接:https://blog.csdn.net/liulianglin/article/details/1267415944 j2 F" @( b' R; h$ r. U

    9 b9 s) r) W, B$ {1 H2 W  t8 k/ S. a! M/ @3 \7 C0 k+ u* z
    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-11 13:46 , Processed in 0.375820 second(s), 51 queries .

    回顶部