QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1897|回复: 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实现)$ P' W) w, b$ d0 U) O& G* @0 p" \
    9 K) B4 G, A6 f- ^: y# R& D+ q( M
    选择排序概念% ^% x2 m9 q& e4 B/ L: Z
            选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike8 g3 u$ r4 Q  k
    ( G9 |% B  m+ ~9 Y- G. s% Y: X1 K
    思想
    1 T0 f# f- W, f, d! Q8 O, I*     每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置8 l) a, v9 f5 u1 l3 q. D1 B
    *     长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;! Q! S$ B' F- c( w  }
    *     当进行下一次排序时,范围缩小1
    3 d! W% \/ m) P# x& F
    % s. e$ B1 I' n5 `5 i9 z& ~+ v代码实现0 ^4 h2 W- @: ]- t" P
    package com.lll.datastructure.sort;
    + c2 u5 n. E6 q& w! E: ^, _* h' N( Z" e  B) _: k# P+ R3 S
    import java.util.Arrays;; J) v8 ~* R4 ~5 ^2 T2 Q

    1 m5 {' O, k# o2 [/**; G# E. C* O! M* ?- u, r0 O5 |
    *
    * X( @- X* I( j4 l% S2 `& b! a* @ClassName: SelectionSort4 u4 f4 G1 W% |
    * @Description: 选择排序
    . o7 a! X, {: |2 q) C, X* @Author: liulianglin
    0 ^- k# `* Z; |* C! |* @DateTime 2022年9月7日 上午9:12:13
    ' W1 v! |- ?$ X$ l: {" v*
    9 S; \; B2 k4 {5 ], t* 选择排序思想:
    % ^7 n; P6 @$ Y) @1 t. Z. L; G( X*         每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    - `' y0 f- \# Y2 u" D8 r*         长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;$ [9 h% ^. h, F1 ~2 Z# Z+ V; b
            当进行下一次排序时,范围缩小1
    ( O9 y! L) X9 l/ v" D */) S% U7 c- s/ I+ y
    public class SelectionSort {! E' d" ?- Q7 _5 @/ W8 Q" Z9 F
            public static void main(String[] args) {" `6 W* k5 h; o. \% L1 V
                    // 待排序数据' s7 B$ ^( ?( {2 }7 e8 s+ v$ o
                    int[] arr = {1,3,2,4,7,54,11,34,9};
    - U: R5 w8 Y* s! U& N2 ^. D5 f3 m& b               
    6 @3 ^6 }5 C; `. U) m" Z1 y                // 记录当前趟数查找到的最大值的数组下标
    ' Z4 E: f, K9 o% c9 a2 g                int max;
    ! I4 ^& C; r' n2 V0 ~* u1 H4 _               
    $ s# }0 I7 r8 @! L                // 交换变量( Z6 s5 N" T3 ~9 g* k$ `
                    int temp;
    ! n7 q& Z# ]5 d! p: C# v                " y3 u7 R, n4 ~
                    System.out.println("排序前:" + Arrays.toString(arr));6 |& V: i/ X3 k
    % i' x  P% i% d/ a
                    // 外层控制循环需要排序的趟数
    ( M0 r: m3 f* c4 x# ^- K1 W                for(int i = 0; i < arr.length - 1; i++) {( o& f5 n; o. [
                            // 每一趟都默认数组第一个元素为最大值
    5 h* T( e( n2 z$ w                        max = 0;* j' [! z+ J. v* w; Y2 y1 J
                           
    7 D) l0 G# f( Y0 o  U1 e                        // 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标
    - h$ w) I, Q1 ]9 |. k                        for (int j = 0; j < arr.length - i; j++) {
    6 a5 f6 m$ ]; I                                if (arr[j] > arr[max]) {
    " P5 o5 Q2 c3 W2 _- Z9 u9 l% t                                        max = j;9 W5 {9 `6 [4 e& l- k5 K, x
                                    }2 e( f4 B# W; [
                            }
    1 k$ @8 O& e& z                       
    9 H9 P0 M' {1 z3 y2 K& v# K: t                        // 将交换变量设置为最大值, 将最大值暂存一下
    / A# l. F& v7 j! m2 e                        temp = arr[max];4 J0 Z1 C" Y3 B  f
                            // 将当前最大值设置为当前未排序序列的最后一个元素值
    1 I# z# c9 |( o+ h8 ?6 q9 F3 N                        arr[max] = arr[arr.length - 1 - i];
    - m( K! c  T; v8 y1 J                        // 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换
      o' y( F4 @* g6 U) g                        arr[arr.length - 1 - i] = temp;7 p) n: l5 ]* I% u: ]$ Y" t
                    }4 r$ D5 d0 d! B0 M9 |& p
                   
    ; _; e- T& [: O' m7 N- G0 W6 [                System.out.println("排序后:" + Arrays.toString(arr));; t4 V4 V# m  k0 T
            }
    $ ]$ t. n) @+ m/ f: N( {}, w9 K! W, w; M/ Y1 L5 T6 s

    & Z- U+ I. C& P+ C关键步骤:
    6 M2 ^8 y- B/ ^" g4 ~. H5 w, Y) G2 p! d1 n" \0 X, B
    1. 首先定义两个变量:分别表示最大值标 和 交换变量;% ?. s! S8 I4 a# {3 ]0 u5 c) K/ s& g

    2 o- u# X* w* J) _2 q$ _2. 通过外层for循环,控制排序的趟数;
    $ Z5 {) y+ N5 E( _1 d3 @  W8 d' K' `( u) B. X- \5 `$ w
    3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;, l: _  ]8 W2 o' t) M
    4 `% y3 J" `9 t( l2 s9 ]( q
    4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;3 H  v- V; x7 \0 A
    ) D6 a/ j9 f" H* F" Q# C( k
    5.然后将最大值设置为当前未排序序列的最后一个元素;
    4 M6 F9 e; R, ^% I( H& f/ a( Y5 V1 E1 f* e2 z
    6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素
    7 M: Q  |. c% r  b' y
    * u) R( d: ]& v1 N& L7.至此完成数据交换,继续进行步骤2,直到数据数据有序。
    + s7 x$ R2 _( {2 Y8 l% I( O. _3 f/ B; v" `" ?
    执行结果4 ^5 F2 s+ B- e

    6 u1 a5 _( k: C+ I4 N8 Y* T————————————————( a4 b4 a* e" z) o/ _9 r
    版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    4 F% I: ?1 ^7 L1 B9 {原文链接:https://blog.csdn.net/liulianglin/article/details/126741594
    ' @) |0 Q% D7 n7 n1 u9 L
    ; g! R, ~# T2 Z' F, U) `9 [( }
    ( P4 B& t; r" R. p$ K3 i& @
    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-7-28 20:08 , Processed in 0.361009 second(s), 50 queries .

    回顶部