QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1853|回复: 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实现)9 ^1 H0 {0 R8 S0 m6 @3 v7 z
    ; e3 [0 G/ Z+ U9 H. i# g' z; A
    选择排序概念; O, i  D( @+ |$ P- N7 _1 R  U
            选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike. D, J; e" p4 T- s4 X1 K

    . O: w. p% G+ r0 q% u) G' U/ o思想
    ( x) a. O9 e; T8 F  u; E/ b*     每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    . }8 F; [& c' U3 L*     长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
    2 S5 G$ I" x7 a*     当进行下一次排序时,范围缩小1- d% D( g  n, b- d" P7 p+ H# g8 ]+ N8 F
    . C- O5 y3 i8 i: x! J! p# Z. J
    代码实现! y& d) ^: W9 L- J
    package com.lll.datastructure.sort;/ L/ Q+ _: F8 B8 g8 d
    - x9 z% ?6 L7 P
    import java.util.Arrays;/ `: X# @' A7 ^& `! r& b
    0 I, _# D9 P4 y
    /**
    . o3 q& G9 Z1 F" p) k( {$ d *
    / H6 e7 L, g9 @$ K5 t, ?* @ClassName: SelectionSort! f) a; g' W0 o4 U0 Q4 s% d
    * @Description: 选择排序
    6 t! d2 |# M6 `# y8 h* @Author: liulianglin
    ; H3 u6 m3 b0 c# {, o* @DateTime 2022年9月7日 上午9:12:13
    5 ]* [) Q* _  ~7 g* 9 U, n9 d. Y. q' i9 u# K7 Q
    * 选择排序思想:
    1 b7 k+ M3 r/ n*         每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置  C3 {+ Q! l( p7 r) w$ Y7 Y
    *         长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
    ; a, C) g: X& p" f! ?9 u; [5 s        当进行下一次排序时,范围缩小1
    , b$ L% ]' [5 K8 B* D */
    7 i* ^' o, y4 l3 H# e. r# S2 h+ jpublic class SelectionSort {6 z5 Y# A2 v: n' r3 w  k) j# C
            public static void main(String[] args) {
    0 i% D/ I( O$ [( N1 K5 `- @  Y$ A& i                // 待排序数据" E2 r1 f. d) ], k4 Q' C9 g: s# l
                    int[] arr = {1,3,2,4,7,54,11,34,9};
    0 B6 b  \; t+ M- q; c( W                6 e" S4 v- c6 v9 H+ y
                    // 记录当前趟数查找到的最大值的数组下标 8 H. q3 W2 J# z- [  N5 Q0 d
                    int max;" m/ s6 l! Q4 a+ [9 b2 f5 W
                   
    ! N  {" Q6 L3 J                // 交换变量
    1 Z1 l  Q: J7 {* {$ F1 f                int temp;6 T6 l$ T/ L# p: K/ |- k! w  b: u. }
                    / q: @) E' s# n$ g* }
                    System.out.println("排序前:" + Arrays.toString(arr));
    3 x5 @' E" W; j8 L+ m
    ' h, X% ?# q* d+ s) X1 G                // 外层控制循环需要排序的趟数
    - l/ n: y1 X+ X, i+ k                for(int i = 0; i < arr.length - 1; i++) {3 O7 v2 S: q. H2 }+ J) v% g
                            // 每一趟都默认数组第一个元素为最大值5 W. ?, H  }8 D& `  {& X
                            max = 0;
    6 U1 K' M! t) h3 `5 d0 Z2 c                       
    - _  M# `2 N# J! O3 ]" I, p                        // 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标* s! ~( K4 \0 y$ ?
                            for (int j = 0; j < arr.length - i; j++) {+ z4 y4 e, O1 r" U" a
                                    if (arr[j] > arr[max]) {
    / S8 R2 c7 b( F5 n' }                                        max = j;
    4 X- c& Z; V, W" \5 ]( V                                }  O7 n# G# c1 I" b  V5 N
                            }( j" N& |; [) ~8 T; d/ @( x
                           
    9 ^: M6 l8 a: w  X                        // 将交换变量设置为最大值, 将最大值暂存一下
    ' t0 d& {) [# _' @4 R                        temp = arr[max];$ V7 v( ?+ A. O5 `; m8 X6 a4 n: U
                            // 将当前最大值设置为当前未排序序列的最后一个元素值
    4 D0 Q, ^  S  r                        arr[max] = arr[arr.length - 1 - i];
    " P. Z7 W# K% L                        // 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换1 I) d; m1 Q/ ~3 q: _+ ]
                            arr[arr.length - 1 - i] = temp;
    " s) |! _: `9 \' Z                }. u/ Z2 W6 L% Z2 s
                   
    # E( O' D8 }2 {' F% a3 J1 e                System.out.println("排序后:" + Arrays.toString(arr));# Z# g, ^( [- H1 P+ x4 J
            }
    * D- V+ n6 T0 a& V}/ S3 Z  {6 i9 l% [4 ~( Q4 `
    & @" X' B" Z$ j/ d  ^% J+ u
    关键步骤:
    ' q6 q. O* J. f' q
    2 P7 V4 \& U4 v2 h% F" n1. 首先定义两个变量:分别表示最大值标 和 交换变量;
    4 A0 W9 r7 q; O% a( O6 w" p; s( O. A0 b' ?7 [$ B5 j
    2. 通过外层for循环,控制排序的趟数;* E0 E& }. ]9 V  `
    ' b% c5 y+ H! n
    3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;% Z( p7 ]7 D4 [* U  p/ @9 v

    3 w$ a5 L7 L# x  n' m! p4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;
    ; }: C3 E- y: ]( n8 p4 M7 f2 f* O; d+ ?# J
    5.然后将最大值设置为当前未排序序列的最后一个元素;
    5 M) x& t& [0 n3 W2 e5 l6 e  k
    5 a! B& r1 ?* }3 d6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素) M  A% N. T' A" W, r4 E$ i

    ' G7 Q3 N. q7 k; }" ?7.至此完成数据交换,继续进行步骤2,直到数据数据有序。
    ) X! `0 ]9 y  f1 e8 d2 y8 P, C9 T6 x" g& ?
    执行结果1 p! r2 M+ [* ~1 N
    & C$ C1 @1 b+ B& o
    ————————————————
    * Q' ~/ V0 L' L1 E  P版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    0 F6 O. D# j' u  a% b! X9 m原文链接:https://blog.csdn.net/liulianglin/article/details/1267415949 n, g% R' |' R9 L  ?+ R" w
    8 b4 j. \% `( D) o3 R
    5 T1 V3 X, w7 o# V5 J. E
    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-12 07:42 , Processed in 0.432845 second(s), 51 queries .

    回顶部