在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 564478 点 威望 12 点 阅读权限 255 积分 174566 相册 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 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 c import 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 l 2. 通过外层for循环,控制排序的趟数;, c M$ Q5 D' I: @& g" d' j1 Q
# b% ?# S( m. }9 A 3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减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" R 6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素/ ]! q3 f; `7 Z8 K# z/ m
3 }4 M, b/ z. f4 W
7.至此完成数据交换,继续进行步骤2,直到数据数据有序。
! w5 f9 z* q8 i 4 l$ `. c. i% n. i
执行结果
' y5 g; S! M, x 7 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