- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564698 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174632
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
排序算法--选择排序(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
|