QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1884|回复: 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 U/ E6 M4 H  b2 W: V5 O( T5 u- t1 e
    ' H& I" C6 _: K* B( Z选择排序概念
    + r  ], c6 J2 L+ ~& u; v* q4 W( n        选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike
    : b# m9 j: ?5 i# _* ^6 j5 u9 T1 e+ b- T( ^; a: ?4 {
    思想4 r2 P2 {) M. g
    *     每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    7 t5 }/ S2 t3 p$ O& W' O*     长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;  D! T+ Q2 w  m+ O# Q( o' c4 h5 T
    *     当进行下一次排序时,范围缩小17 [* }9 |, [1 `9 I- a+ e
    # T& d7 T" |% A  u5 y2 r
    代码实现5 N$ [% ]9 z3 F$ r% L
    package com.lll.datastructure.sort;' u5 _5 y' d- `5 E7 p% B

    * \! p7 Z5 T, Z0 ?" {import java.util.Arrays;
    / E; d% O, X  s5 I- P; }
    1 H' Z5 W9 x" H+ s6 h4 a/**1 t6 ~4 |3 ?* r0 H; c5 R! s
    *
    7 y+ d  `% u9 m5 @9 k* @ClassName: SelectionSort7 B% ]$ k" \  l0 c7 D
    * @Description: 选择排序$ `+ d" Y; T2 |* y
    * @Author: liulianglin
      ^. w" Q* T' K3 K+ Y) f  A* @DateTime 2022年9月7日 上午9:12:13
    " o5 R( I3 w* K6 E*
    - p6 _, n5 D5 y7 y2 W) P* 选择排序思想:
    " [5 _+ C# a/ A' V4 _% m) u*         每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
    6 G5 u* S/ P; x. z, |6 W8 }- @*         长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;8 S$ r( D# i1 P8 S  H/ d, z
            当进行下一次排序时,范围缩小1' l; E$ j# {6 ~# K
    */: O& Z: e( H' d& C7 h. q8 S' `- ^
    public class SelectionSort {8 H! i: }2 s1 E7 A
            public static void main(String[] args) {1 N6 }2 i' R6 {' e$ R" e1 o
                    // 待排序数据2 P& J. k' V5 M5 L
                    int[] arr = {1,3,2,4,7,54,11,34,9};
    9 N/ D5 B; K8 X0 p, \8 j1 c' f/ Q                : \9 s1 [3 a. S- N1 m
                    // 记录当前趟数查找到的最大值的数组下标 1 K1 ^: G5 O! V4 D; C
                    int max;0 H1 f+ N1 R* a% u0 D5 U
                   
    6 Z$ x( h1 T$ ]3 L/ [  V9 b2 g                // 交换变量
    ) Y! q, Q, K' e6 o                int temp;) Z- y: O5 ?8 W) i" S" h
                    * {9 U0 d: M: C( F" i* C$ l
                    System.out.println("排序前:" + Arrays.toString(arr));
    ( S1 @, g7 g1 d& U( i
    7 T1 \( Z4 j, D3 Y8 |                // 外层控制循环需要排序的趟数$ _* t0 N* K, `" [! ~. Q5 {
                    for(int i = 0; i < arr.length - 1; i++) {
    * r# b) w* j6 j6 M8 u                        // 每一趟都默认数组第一个元素为最大值2 i- V9 ^8 e/ k0 s. P$ B3 ]
                            max = 0;
      \! Z, O& O' v                       
    # c# U/ I, Z$ |3 A, Y% ^) q                        // 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标
    & Q7 Z, r# A1 O# o& t$ m                        for (int j = 0; j < arr.length - i; j++) {
    8 f) q5 C& @7 S5 C/ j% k" Z& @                                if (arr[j] > arr[max]) {$ N& l  K6 `8 z- j0 B
                                            max = j;/ u& E: M. s# @8 X- h% i
                                    }) s3 P. t' R1 |" @# Z
                            }
    ' g& M7 E+ P/ {0 S& y4 |                        / ?: A6 D/ m: x% k3 d+ B
                            // 将交换变量设置为最大值, 将最大值暂存一下
    * z. j' H6 c& |) J# z+ r                        temp = arr[max];& ]6 ]) D$ G% g3 P
                            // 将当前最大值设置为当前未排序序列的最后一个元素值
    / k5 U- [4 r9 b                        arr[max] = arr[arr.length - 1 - i];
    2 K8 o+ `& s8 v3 T, l1 ^3 b                        // 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换8 o0 @8 \" B. K7 m* j# h
                            arr[arr.length - 1 - i] = temp;- R' D: l4 r! O4 ^
                    }: ^7 R) w( v* s5 |% A
                   
    % a6 T  l- T- `                System.out.println("排序后:" + Arrays.toString(arr));
    5 J) M1 \+ `0 q8 P. x* r        }
    3 z; k8 m  \- A  A0 l}6 f0 z$ a" K, Q6 h

    . B# O# O9 Z  _1 o3 q0 ]/ N关键步骤:
    & K" d* [" v) p/ x  Q# @
    . I4 n! y, G6 O1. 首先定义两个变量:分别表示最大值标 和 交换变量;5 H, B+ b! L( Y- X9 Y# V

    & }9 z- A9 {6 G; r2. 通过外层for循环,控制排序的趟数;
    & H0 S0 o3 p" r8 j
    9 K: h+ i+ k* |1 p0 e3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;
    0 Z2 V8 W% v8 X  F; K
    7 O. Z6 T* ~  [1 D% T! h4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;
    " H7 Z/ V9 T7 x6 `: u/ P2 R4 H; A% J
    0 k7 E0 }) [' Z* o+ g9 k1 c5.然后将最大值设置为当前未排序序列的最后一个元素;, N4 z% Z% H  P8 j

    % }' e' C" l. a" J& I6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素
    / N2 X* |0 H% w; a4 W
    " s4 J2 T; ^) z) C# \7.至此完成数据交换,继续进行步骤2,直到数据数据有序。/ U8 J: {4 h" q+ c+ ~7 a
    . B9 n! a! ]& n, {9 K9 ?
    执行结果
    ; F3 t; ~& K4 m9 m
    % t/ S1 G$ |! u  j————————————————
    9 T) _( Z* ]) i; U8 r版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ; U, \8 m* L  Q' f( E$ P原文链接:https://blog.csdn.net/liulianglin/article/details/126741594
    8 Q( l, r& R2 i2 Z- z& r- q- @0 Y; z# L  N
    , E0 ^& \7 D6 v6 i7 J7 X# }( @
    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-6-15 06:09 , Processed in 0.407245 second(s), 51 queries .

    回顶部