数学建模社区-数学中国

标题: 排序算法--选择排序(Java实现) [打印本页]

作者: 杨利霞    时间: 2022-9-8 10:05
标题: 排序算法--选择排序(Java实现)
排序算法--选择排序(Java实现)
: `# ?& @/ i/ ]; K- P" [& j% l' q7 U% Y& D. Q0 ?% G" ^
选择排序概念
* m& D/ }" b. x. d" ]7 b5 s. \        选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike$ t& _8 b! Z/ l5 I+ \/ o( Q6 f
, w1 j( k; m+ M, F5 t# s- ^: J
思想
9 t& {' m; I5 x3 {*     每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
8 }* K* w" g6 h9 e2 i/ P*     长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
# t& P9 U6 S0 g# ?/ o$ T# v*     当进行下一次排序时,范围缩小1
/ r8 V( Q! Q$ d0 i. [! E' s4 \4 C" v) o$ X" z+ e' r
代码实现! O. |$ U. w" p# g
package com.lll.datastructure.sort;8 @9 Z+ t7 b" L0 C/ r
0 P( k' o' {3 |* d
import java.util.Arrays;) u# \  h3 |5 f9 P  n. {2 k" {" D
# t7 p+ {9 B' Q' _4 j& Y* y5 _6 `, @, L
/**# J) q+ z" y/ ~; }# d* y+ H
* - M: F7 r2 f$ {5 @" u
* @ClassName: SelectionSort
# Z1 Z0 f  K6 B5 m* @Description: 选择排序
+ B1 I% H9 F& q" t$ {( f* @Author: liulianglin
$ y$ L1 k* y6 _* @DateTime 2022年9月7日 上午9:12:131 o; q, Z( e" D
* 8 f  h, ]3 M6 V2 j! `
* 选择排序思想:" [/ B* L- Z0 R! r# X: M7 d  ?
*         每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置* Z8 a# N, O" i5 y
*         长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;4 Z8 L: }5 g$ x# B. Q- Y
        当进行下一次排序时,范围缩小1' g' M2 C4 f8 i+ j4 x
*/
& m/ V8 J  `9 |: N( vpublic class SelectionSort {
+ H+ G+ f6 r+ I- B* u9 }4 y        public static void main(String[] args) {
: d" b3 F+ I" p1 @( `8 A! J! Y$ O# P9 g                // 待排序数据
) d3 u0 I( c5 ~0 `9 }9 X                int[] arr = {1,3,2,4,7,54,11,34,9};
9 b4 D2 v1 S; W: D( R; X, H                . m* N0 P: Y$ K& n$ N
                // 记录当前趟数查找到的最大值的数组下标
% A& e& ^2 C; |4 o1 o6 |                int max;8 Y4 T% S+ @. {! }' [
                - K9 ], U. p! I7 M7 \
                // 交换变量7 Y7 T7 L: b6 i' e! l$ s
                int temp;5 {  N5 |& y# I8 a/ M$ o1 g
               
* g+ `- a& v' q2 ]( K4 t                System.out.println("排序前:" + Arrays.toString(arr));9 i& S, e7 n4 u- f/ U  o

% K( q  Y# k8 B; `, N2 q                // 外层控制循环需要排序的趟数
7 u" [) @/ B7 ^1 t                for(int i = 0; i < arr.length - 1; i++) {) `$ v3 g$ f5 R
                        // 每一趟都默认数组第一个元素为最大值
& |# n( H" m& m  U6 y                        max = 0;; v! e( D- b! n2 d9 @
                       
, T" U1 z0 ]  s: I6 t( X; e                        // 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标- U% ?/ q  x2 R
                        for (int j = 0; j < arr.length - i; j++) {( c1 g* W2 W/ d$ V* P: X9 a
                                if (arr[j] > arr[max]) {
, l/ i+ ?# M+ T' }+ ~9 ^0 }                                        max = j;/ K2 n0 d! i: h( ~4 {" }
                                }7 i. O# b; V) P, `, @4 }
                        }6 l, Q% b" t6 ^0 N
                       
/ K; R5 s4 P" D                        // 将交换变量设置为最大值, 将最大值暂存一下9 |- ~) I8 ^# ?! v/ ?
                        temp = arr[max];& i6 g7 u6 p7 O$ w- ]/ o5 Q7 @+ V
                        // 将当前最大值设置为当前未排序序列的最后一个元素值" n! A. |7 q9 w  _# V' R3 T9 y
                        arr[max] = arr[arr.length - 1 - i];0 q) V. h# V: O& C7 z3 G+ x$ x
                        // 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换
9 ^, N& e+ p- a* {( u# u                        arr[arr.length - 1 - i] = temp;0 V- ?% V* h, _( J8 ?) e2 b* N
                }
' G, L  Z( `9 l% y                : G+ j$ ^% X  f8 T. Z0 Y0 |0 K
                System.out.println("排序后:" + Arrays.toString(arr));4 S) x& D5 l6 ?
        }4 |: F6 w: ^- B9 s$ w" [& f
}/ L& g. C& U+ r7 `
4 F) p! |% v! [3 o( a$ P
关键步骤:& v  f4 Z1 V) ]

3 [+ O: n0 f2 m- x8 x1. 首先定义两个变量:分别表示最大值标 和 交换变量;) v" x9 @- u  j1 w7 F

* D. I+ O% ~$ T/ y) O4 f2. 通过外层for循环,控制排序的趟数;
4 b7 P7 |: f5 W+ {: o4 @  A: J1 j- u( M
3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;# q, o3 f9 |2 t; j; M

* P1 {* i0 i: `7 ?/ g# Z4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;
* S" m4 P( l: p* h! i
5 m8 S* P+ Z  X" _5.然后将最大值设置为当前未排序序列的最后一个元素;
4 n5 ~' c) q4 d- x
' R" b, j9 I, A( _1 K( H' U6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素2 o; w/ V3 i4 M

. O* k  x% E" w7 K4 J: s' O7.至此完成数据交换,继续进行步骤2,直到数据数据有序。: j& [2 s4 k8 Q1 U1 X

3 P8 E$ T7 l) n) L! U 执行结果
: }' k3 i! G7 \' i2 D( a" T% a, L5 }1 |' G) b5 |# w$ d9 i
————————————————/ w8 ~: c: t% f+ k& b6 m! G9 }
版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
" O9 g2 w2 }7 H3 z  Y原文链接:https://blog.csdn.net/liulianglin/article/details/126741594/ A6 W- F+ F* J7 b* P+ c# V
; ^/ J7 B5 J6 s2 b
. C1 e" f+ ^# ?7 C4 F





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5