QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1854|回复: 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实现)2 _$ F6 W( F* B) f5 `3 ~3 V

    $ u& d& c! Z0 I; e& k1 L选择排序概念
    ( t$ O. [: t% @2 {# T9 n0 H9 Z        选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike4 r/ v4 y) I# E6 K3 j, [% x
    1 C+ s6 h' B9 L, C8 {. r3 K. @7 j
    思想3 g" \% }! v/ y9 X- n0 t# {6 @
    *     每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置+ L/ _! \3 a$ ?2 e/ U3 Q
    *     长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;4 B1 O  {' f4 W: r; B! m
    *     当进行下一次排序时,范围缩小1
    . k- ~( P! `* K( I1 Z
    " G% U8 G- Q& v' k; p代码实现7 c- {6 ^  H: j5 ~  e7 c) r
    package com.lll.datastructure.sort;
    - p- g. m( n. E1 u3 s8 Z7 i# \$ ~; x' w9 F
    import java.util.Arrays;
    7 {( n/ a% [9 ~9 x0 L7 M
    5 L0 Z3 ?: \: q$ J' r+ L/**  f. P* M+ G. e
    * 8 s3 @0 D8 I, J* E: U
    * @ClassName: SelectionSort
      c3 n/ h9 S# }) u$ s! }' C* @Description: 选择排序
    ) s8 U0 O, ?# K$ y- A0 H/ O; A: w" `* @Author: liulianglin
    + P. H& K$ r" H- G2 m- U% R* @DateTime 2022年9月7日 上午9:12:130 S( ]) t( Z( a, L, w+ k
    *
    8 s8 g# a8 U0 t: z( _8 Y0 R2 V' u. _* 选择排序思想:: N, Y9 L, \$ @6 w( s1 {: W
    *         每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    9 I0 i+ T! e* ^0 b*         长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
    - p) l9 @* e4 r, W- H/ ?, k, f+ U        当进行下一次排序时,范围缩小1+ P! ?, a* S8 x- N" m: j
    */
    & t" L2 M$ n$ a8 u& t4 d- ]2 \) A! e% epublic class SelectionSort {
    $ w/ u) r9 U6 r# w+ S        public static void main(String[] args) {- t7 T" F' h3 d7 J! n/ {9 W
                    // 待排序数据. ^# [, |/ A9 g* Q- N1 F( ~9 _' p
                    int[] arr = {1,3,2,4,7,54,11,34,9}; ' p1 D: I* i2 U  H
                    5 {) }1 ]: L+ H- F* m8 J, I0 j% x
                    // 记录当前趟数查找到的最大值的数组下标 # x: C( \  T% z& \. k3 L
                    int max;
    ! c( ?0 r: b# X! q# ~! r                % V& H2 W1 I) Y6 _  |
                    // 交换变量" e7 m( V7 Z7 B* F) C
                    int temp;
    - C9 N, I/ _' G. g0 m% X                : H  P- p, u/ R5 i* Z# {: S
                    System.out.println("排序前:" + Arrays.toString(arr));, x7 ~8 h: n5 T
    - X$ B( l# J7 d/ b
                    // 外层控制循环需要排序的趟数% R7 U7 Z. ~  u8 o  a" F; x
                    for(int i = 0; i < arr.length - 1; i++) {
    1 j; J$ {) \# |, X                        // 每一趟都默认数组第一个元素为最大值. w/ K. H. v" ~
                            max = 0;
    2 b% J* V6 J1 q                        & V3 l& k0 b* a! ~7 e) S& Y5 z
                            // 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标8 }, }2 E& c2 j# d: e; w* E
                            for (int j = 0; j < arr.length - i; j++) {# k# m% _5 ~/ p' S8 @
                                    if (arr[j] > arr[max]) {" i2 u7 ]; e  g1 K+ w
                                            max = j;+ ]$ o* g3 H- Y
                                    }& ~8 D( Y+ p- p: i7 d- C! N' U
                            }
    8 K/ H! {5 F. |& L, S) W% W                       
    & y9 {' F. J6 [( z: g' ?7 M4 d                        // 将交换变量设置为最大值, 将最大值暂存一下
    1 ?/ _: Q( {- o0 Y- e7 T* }. J1 n# ?* E                        temp = arr[max];
    * J1 e' Q! }* c; h: }- F                        // 将当前最大值设置为当前未排序序列的最后一个元素值; d9 w# a5 P7 X4 B0 Q
                            arr[max] = arr[arr.length - 1 - i];
    & P% B3 `9 c( o                        // 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换
    " W+ \* e: y1 h7 m4 {9 \, @                        arr[arr.length - 1 - i] = temp;
    7 Y9 D- Z# X# |* g" L4 Y$ g                }7 p& E9 l' p' v2 W
                    1 x. S& m6 N, B
                    System.out.println("排序后:" + Arrays.toString(arr));( K% Z: g% }/ |' Y9 _& _
            }
    , U: b2 Q" X7 J* f}
    ) H; b7 _0 r& E0 s) u
    " O: v3 i2 E5 G) D8 K) S2 h0 o  S关键步骤:. i" A4 J+ g9 i3 L- \, Z* ^% u2 ]+ V

    + x$ B  R( @! x6 ~! n- d  L2 e1. 首先定义两个变量:分别表示最大值标 和 交换变量;6 \7 ]5 E" q1 Q" _8 G7 r

    3 X- ^3 q7 S* r. B; f2. 通过外层for循环,控制排序的趟数;( q) ^1 s" {: A6 m

    1 H( \  a6 a& E7 x( i3 X3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;% x0 p+ }: I9 R0 _4 {: ^; I

    # W* M  M+ [6 @1 G& E+ w* i4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;$ m  x2 r/ R, l5 H5 D  d, g

    . u9 p5 O6 ~! r& w5 k5.然后将最大值设置为当前未排序序列的最后一个元素;
    / Y9 s* ^( V/ q3 t' N8 j! C; @8 c% a. g8 l" m2 }
    6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素' V  ~8 q# f. m9 l7 E
    & }0 C. s  U" u' A8 [: m3 O' u
    7.至此完成数据交换,继续进行步骤2,直到数据数据有序。2 \% z" o% c4 }5 |/ t0 Y) K9 V9 T

    & c9 i- k5 [6 _3 h0 u& ]" @7 o  @. { 执行结果
    : u" b  G1 O' P( ?' y) T4 B+ d$ j$ B4 C
    ————————————————# b' p& v2 |) {$ ^- x
    版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。- V3 i; |3 k# `2 w
    原文链接:https://blog.csdn.net/liulianglin/article/details/1267415940 \# M7 R* |3 i( }9 F: J4 a( I" ^

    * i7 Q7 V0 T1 t" D5 M% x. T/ S: @4 R4 l. g& w1 K
    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 21:38 , Processed in 0.298793 second(s), 50 queries .

    回顶部