- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563260 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174201
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
排序算法--选择排序(Java实现)
) B: y* j1 N0 j7 |/ o7 G; z( {& N. r0 V v; p. k* U
选择排序概念, y+ ~, U( [# M$ G* r, P
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike1 W. Y( f, Y2 V0 _
" H* D# u" }. Q! x- ]
思想2 Z' j" G0 l1 b4 Z- i2 | v3 t
* 每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
3 ^ b( p1 Z. I+ {* s* 长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
7 {5 o; M/ ~# ], c5 t, J3 H* 当进行下一次排序时,范围缩小1
: Q6 y# q ]. I5 i- Y: \) y# @, k
% }9 }0 O( {# a4 E) x& F& c代码实现9 K. H, S; T% K( L1 |% Z
package com.lll.datastructure.sort;1 m# V; R" C5 j6 c5 @
8 K6 J$ y, o4 X8 ?( Bimport java.util.Arrays;
" V1 \. Z& ^5 K) Q1 N4 l% o) {& Q5 a7 ^
/**
7 j$ [; ]' Y+ ]* B5 r4 i# S * . `$ b! C' x9 o. O
* @ClassName: SelectionSort
+ K3 Z& O; F, G% M- V+ A) v* @Description: 选择排序5 ], Y% g8 }3 k+ f& D
* @Author: liulianglin
* r) H( [1 R6 X* ~9 p# V* @DateTime 2022年9月7日 上午9:12:13
- q$ R$ X4 Q( g. m4 u9 a ]$ U*
, ]+ y5 }1 d/ f: K, V( A, v$ T* 选择排序思想:5 R( g5 N! a, g% K$ P& D R
* 每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
0 p: e+ O; r- s* 长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
" U8 A" {6 _% T# T 当进行下一次排序时,范围缩小1
. W1 @$ F: W) |" W! d3 g8 m */
5 X. w% ? h- epublic class SelectionSort {
H) L8 i( e0 ~0 [! k' u7 V public static void main(String[] args) {
K. ]" g9 d9 P5 Y3 [9 w, e& V2 S // 待排序数据; {8 u+ h# U6 p6 F8 x
int[] arr = {1,3,2,4,7,54,11,34,9}; 8 M8 s" Z( r3 B. d% J- f
7 H7 G) M& ^; y# H // 记录当前趟数查找到的最大值的数组下标 6 [9 j2 F- s* S3 g# f, O
int max;% i8 Z8 C$ { e8 Z
p S+ ~ q9 m // 交换变量6 p2 k% B1 t, f* B
int temp;3 E. W& K7 q! H3 F. @; p( f& i
u s, f" Z: k. Q: m System.out.println("排序前:" + Arrays.toString(arr));
; c9 r/ r* u2 j s- b& s) V; G( D. I; a" K0 A) q
// 外层控制循环需要排序的趟数
. l* c) g0 X% g5 C1 F: a" w7 [ for(int i = 0; i < arr.length - 1; i++) {
1 n' h3 q+ N1 Y3 A8 }4 W // 每一趟都默认数组第一个元素为最大值- U! \( x$ P' \& |( ?6 x4 M
max = 0; L. z' T4 g5 Y: ] G
5 l8 D6 X# G1 P- H# l1 K5 z
// 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标
7 e& `4 b, O6 S4 Z( F* k! o5 f2 C for (int j = 0; j < arr.length - i; j++) {6 R8 j! C0 Z, X8 Y0 B6 k6 K
if (arr[j] > arr[max]) {( }- r x7 ]3 v! ]( k. X
max = j;; H$ G0 {7 d8 ~8 U9 r q
}
5 S' B$ l+ i) _0 }. p }
% I5 J; k# m. [ " y- r# l" c4 |% j- V
// 将交换变量设置为最大值, 将最大值暂存一下$ w2 k; R0 i+ Y; \
temp = arr[max];+ U$ F6 R& E6 Q0 D2 |
// 将当前最大值设置为当前未排序序列的最后一个元素值
) V: G& M5 M/ U: U3 y( S* t6 a i- p arr[max] = arr[arr.length - 1 - i];
( _, g O( b& E% b& X2 h0 F3 ?" B // 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换- R8 w& c# K C6 Q1 z
arr[arr.length - 1 - i] = temp;4 }4 s% u! u, c3 R
}
8 H# t8 X9 h4 @, I. [9 @ - c6 e5 d2 {% G$ q: ]
System.out.println("排序后:" + Arrays.toString(arr));
8 V: F% P" g' q }, Z( }! d1 L# N' w& w% a
}
a: T& c* q3 J5 |' I e$ z! F& Y) k. ~8 _; y
关键步骤:# w s1 e. T# ?5 E7 b% X k
, E% R( ?* ~9 C( R" _1. 首先定义两个变量:分别表示最大值标 和 交换变量;
% Z0 q& E0 |0 U* b( x) g% u0 { i
. N3 f" e! p+ _3 R' [6 T2. 通过外层for循环,控制排序的趟数;# S; o& }7 ? b( N. ~
2 } R9 c: e( T# a0 M. E8 h3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;
8 l7 \8 R4 i1 |7 S! u
2 t$ H, u, p0 [; V4 @* q' a% o4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;
: v) T$ K9 T* U9 U L4 U2 o8 \+ B1 O9 @
5.然后将最大值设置为当前未排序序列的最后一个元素;% w" D' `7 {: N9 [4 e: _- z' b0 I
5 Z# q9 m: `5 w
6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素
]6 k8 ^6 w7 E; v- r( n" B! w
1 t% O' \7 R. ^- F5 r( E7.至此完成数据交换,继续进行步骤2,直到数据数据有序。
0 D, m9 p6 r1 J
% N: W* w! h' D" g* Q 执行结果
; ?: g; j2 l$ {
- G% o& m* N; M6 x3 B9 w w————————————————, u& ~. Q% \" A" I
版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
3 T8 `8 }( l4 J% @- [' W/ e原文链接:https://blog.csdn.net/liulianglin/article/details/126741594
, [+ H% p$ i0 }
# X& @2 H0 A8 t: z# e. l4 g [3 A3 U" ? p4 g
|
zan
|