QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1873|回复: 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实现)
    6 A  E" M1 S- N% L1 b/ r! |) x, S, Y0 c. z0 k0 B) ~9 }& L
    选择排序概念9 A2 O- ^" Z- y; {6 F
            选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike/ v& I1 w. Z* c% O3 f' E5 j

      a' Z0 R; ?" h思想, h# l8 {9 u; |- y# s! N
    *     每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置, X4 E) O! ^+ X/ |2 ^! p2 J
    *     长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
    2 h. W' P3 [) R& m$ a3 I' b*     当进行下一次排序时,范围缩小10 d4 ^4 b9 ~! Z' e) g

    + M! z8 d- d2 ~  p5 o代码实现" z% B1 {6 C, n! E. t
    package com.lll.datastructure.sort;
    " S" p( ]* o0 z# [; M- E
    / f6 t; q3 A4 J1 ?, Z0 cimport java.util.Arrays;1 G/ j- A; J5 I
    $ u$ E; q: m# f$ E" b# @
    /**: u8 H8 R  D) B1 p. l
    *
    : w& V9 ?0 D3 M" q9 o6 U. L* @ClassName: SelectionSort: ?# e% _* w. z4 Q: V& D
    * @Description: 选择排序1 _/ H. u+ u6 K
    * @Author: liulianglin
    5 h0 B. ~1 W  X/ \% P! {* @DateTime 2022年9月7日 上午9:12:13
    $ l/ x7 J9 C9 X3 e$ F- [0 K* / }9 D3 v) T3 s2 t" `
    * 选择排序思想:! x  U3 M* |$ ~2 P
    *         每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置7 W/ A: c) v1 P( y0 {
    *         长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
    8 ~1 Z& l5 Y) J  E" S& [        当进行下一次排序时,范围缩小1) N" i3 ^  S( R* q+ K
    */" I/ Q2 d) b' z) j( h3 ~
    public class SelectionSort {
    - X. B. h8 V: y        public static void main(String[] args) {/ ?$ @1 a5 s9 A8 i& a4 U- k8 P
                    // 待排序数据
    ! a! R  A+ h/ l) {- S0 _" t9 d                int[] arr = {1,3,2,4,7,54,11,34,9};
    & m* Q! @8 h2 j/ T$ F" Q               
    8 Z3 z- o' t- ~, P$ S                // 记录当前趟数查找到的最大值的数组下标
    + x4 _. L: R6 S6 y5 a" H) v0 B2 C                int max;- O% H7 h& c- D2 ]( k* R
                   
    " q0 i! R& w7 K% Y+ e9 y# F                // 交换变量3 V0 @! K4 O* Z# m5 U$ ^
                    int temp;) A0 O- y8 x8 r& g$ v- Q& Z* o
                    - z( `$ K5 P% J7 X1 R9 v# w7 W2 B
                    System.out.println("排序前:" + Arrays.toString(arr));* j0 N1 Y) L0 Y8 T3 z& E
    . T0 c) P+ J. w! r+ ]! Q1 z' K
                    // 外层控制循环需要排序的趟数
    , M* f" k! J; ]! D" I% l( }0 W                for(int i = 0; i < arr.length - 1; i++) {) D9 G  W$ |& k" V% z: B+ P* `. N3 m7 S
                            // 每一趟都默认数组第一个元素为最大值
    ' g6 |1 L  f: Z  y- T                        max = 0;
    7 h7 Z, m7 a7 ^5 E/ E/ z                       
    * V5 F! O5 a  U                        // 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标! ]2 m9 o5 ^: _" Y% A
                            for (int j = 0; j < arr.length - i; j++) {: l# g4 U# c8 F: l6 N0 ]
                                    if (arr[j] > arr[max]) {- d+ m7 r3 x- [: ~1 D' p: \' Y7 ?
                                            max = j;2 v( `, o! }: y) Q
                                    }
    " r8 S" C+ y& C  E7 b5 h                        }& M) n2 P) @2 [- e; c( \3 a7 Y
                           
    7 h( ~  t5 @6 x! l                        // 将交换变量设置为最大值, 将最大值暂存一下
    & p/ p- P, l" O/ j) O% s' ?                        temp = arr[max];
    ! L7 z5 U8 {- y0 h                        // 将当前最大值设置为当前未排序序列的最后一个元素值4 |$ W. e  h. U0 T) m: r
                            arr[max] = arr[arr.length - 1 - i];
    ' L8 @, d, A  x  Y! ^# _) H                        // 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换
    8 _: ~# x- g2 Y/ m7 A$ B6 E8 i1 A9 l# P                        arr[arr.length - 1 - i] = temp;4 N! S+ S6 \4 C9 b: S+ v1 e/ Y) ]
                    }
    . S5 ]) a( j& S9 b8 R2 s                . G5 n( u$ O! c* N, l
                    System.out.println("排序后:" + Arrays.toString(arr));
    2 J& b1 F: }! a/ j. ^5 P        }) a/ C) d( o3 P# K! D) W
    }2 P1 ?$ J' R+ k8 b5 \4 B6 D& M

    2 d8 ]+ ?9 t! F# G关键步骤:
    , P1 L7 H; D1 Y/ d) L
    7 Q8 r5 A# V2 F8 O2 ?1. 首先定义两个变量:分别表示最大值标 和 交换变量;
    # w" ?" b2 R9 n# h. g* {4 ]
    # z; u$ f3 H1 x3 l2. 通过外层for循环,控制排序的趟数;, c  M$ Q5 D' I: @& g" d' j1 Q

    # b% ?# S( m. }9 A3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;, }% w6 B7 C) Z8 I- a
    0 q$ `) Z/ w7 A/ \
    4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;# W6 f+ S8 G; q* j5 n  ^
    % F1 h5 G8 G2 M! g5 }6 _+ H) w
    5.然后将最大值设置为当前未排序序列的最后一个元素;: q& D" j0 d1 G$ n$ t1 L+ Q1 |

    . a) q# Y9 @) S! ~+ K* W" R6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素/ ]! q3 f; `7 Z8 K# z/ m
    3 }4 M, b/ z. f4 W
    7.至此完成数据交换,继续进行步骤2,直到数据数据有序。
    ! w5 f9 z* q8 i4 l$ `. c. i% n. i
    执行结果
    ' y5 g; S! M, x7 A. S  W/ a' f" P  E9 V/ V
    ————————————————. g  M* r9 c; l/ ~
    版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。$ u$ J! p4 g& u; _" Y
    原文链接:https://blog.csdn.net/liulianglin/article/details/126741594
    % i  ?+ c! M6 m
    3 n' i. Y& T8 c2 `* V7 p
    & g  j% ~% e6 u" l# B
    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-5-28 09:14 , Processed in 0.442900 second(s), 51 queries .

    回顶部