- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564477 点
- 威望
- 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实现)/ M7 s7 h+ e7 q# P
% N$ t5 ~* U5 n. m选择排序概念
' K- n, q# Q8 N% x 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike1 D2 Q1 k1 V0 H+ x; T
4 S7 w$ H _1 U! {- G: r
思想* U+ N8 q( W2 {5 T
* 每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置
9 h* z$ G0 c( R5 J* n* 长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;% g, d" \% q3 S- a; j
* 当进行下一次排序时,范围缩小1
: s4 s+ R# z3 z Y- s, N
7 r7 Q7 ]5 u* O代码实现6 h6 q5 j! S& M) o
package com.lll.datastructure.sort;, t6 v( a# B6 Y: |3 p6 W5 A
+ Q; d2 }4 S' B, a! f; J
import java.util.Arrays;0 N6 b# n2 y+ ]. J9 g( A& j$ q3 D
# E6 j! p7 e9 `- B0 P4 j, I/**
+ L# E. P( V1 \ @ * ; Y- E8 R; [. }, u' ^1 H0 L" m0 K
* @ClassName: SelectionSort
& r+ x- |6 u5 C* @Description: 选择排序$ J; w4 _3 i7 s
* @Author: liulianglin2 t$ {$ K; S8 E8 @8 L- B8 }
* @DateTime 2022年9月7日 上午9:12:13
9 D. A1 e# `3 T9 ~5 E5 X*
@, y- e% x. O' H; y1 G$ }* 选择排序思想:
6 n2 J( X+ \5 T& o* 每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置 Y& n& ~7 b8 ~: f* G
* 长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换;
7 m+ f, A' d( k 当进行下一次排序时,范围缩小1# E" [* }6 |% b. `& k) d
*/
2 s& i C# b5 i. rpublic class SelectionSort {* b& o2 h. o7 U
public static void main(String[] args) {
) ~1 E6 e; l4 T // 待排序数据
2 a5 X' |; J$ g0 `- U int[] arr = {1,3,2,4,7,54,11,34,9}; ! M' E+ z+ Y) J. s" f# g
8 { r) G/ n% X1 ~1 x! l3 F6 ? // 记录当前趟数查找到的最大值的数组下标
, N0 u2 n/ P9 u! w6 C int max;+ u! [4 q/ m; ~! u
- `/ D. X3 E- k$ i. H$ ?
// 交换变量, P/ L* X% `* Z+ t
int temp;$ l7 C! o# k, p8 m
; u4 q# }' e- R System.out.println("排序前:" + Arrays.toString(arr));! S9 K: \ _" }- h8 s
, B8 c2 z1 d' ]: J. O // 外层控制循环需要排序的趟数) G1 C' `$ O7 Q$ Q9 v" b; B
for(int i = 0; i < arr.length - 1; i++) {
0 N0 z f1 Y" L, `, L( \. p // 每一趟都默认数组第一个元素为最大值
/ N- z( s+ d4 \* F, Z4 \ max = 0;
3 B: S- `0 ]3 f* C" o 6 x6 P4 Y: Q6 o/ }6 |
// 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标
2 }5 ~8 p4 j( P( w. I for (int j = 0; j < arr.length - i; j++) {
- `; P4 X/ n6 l# { if (arr[j] > arr[max]) {9 Z x4 s. Y+ {1 j, G" r. W" K
max = j;
7 ~2 k$ O/ D, k9 {# e; U o/ `2 O }
9 K# ^7 F& k0 s2 e! Q* V% W }/ Z: t, e2 p/ N H5 q r; ?7 s
; k# T* H f8 U$ L. G5 g- O# T
// 将交换变量设置为最大值, 将最大值暂存一下! `+ b( O3 p) x+ @
temp = arr[max];6 ?/ y4 n8 I7 L7 l
// 将当前最大值设置为当前未排序序列的最后一个元素值
% j- j/ o& c; z, y: }& J; v- z. R arr[max] = arr[arr.length - 1 - i];9 e. X B1 x# ]. a7 ~$ b6 J
// 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换$ Y: S/ V* U. L' ^+ |' F* V7 P# l
arr[arr.length - 1 - i] = temp;
5 G+ M4 [7 d7 e; ^4 K7 g& m }' `% c4 H* `( c) y
; E6 ?2 ^3 E* H! {) C4 d. v- q; x# Q
System.out.println("排序后:" + Arrays.toString(arr));
) [/ u2 Q% J9 y& P& M. x3 n8 ` }
8 } k1 W2 Q v; O1 b}
+ U$ Q) Q% Z7 x/ S- ?" O
2 d6 b6 y( O4 E) l) D. h% {关键步骤: c# b: c4 @8 ~9 r1 ]6 `
* m( t9 _: s1 c" B2 R% J1. 首先定义两个变量:分别表示最大值标 和 交换变量; C) l) h- P; Z1 R1 W& ]
1 T! O9 q7 w! @3 u7 I7 y" \2. 通过外层for循环,控制排序的趟数;
/ W' E* A8 i# y& C. I+ W) E
/ z1 q' e$ S n4 U0 Q3. 通过内循环控制每趟需要遍历数组的次数,每趟会较上一趟减1,每次会得到最大值的下标。再下一趟外循环会将这个下标重新置为0;
K: [, T3 o$ c. X- G. y6 Y' ^$ P; m( J8 ^9 d6 V2 \
4. 每趟找到最大值后,将交换变量设置为最大值,目的是将最大值进行一个暂存;
8 s8 q+ T; h3 ]6 K
3 {3 l: ` I% B. H9 y5.然后将最大值设置为当前未排序序列的最后一个元素;
# u! h; H% T' k g# ^9 W: S, H7 E0 L7 Q
6.最后将第4步缓存的最大值,设置为的当前未排序序列的最后一个元素0 U( _% Z3 V r
" {. T N6 q! q3 M
7.至此完成数据交换,继续进行步骤2,直到数据数据有序。
9 @, S4 F; i3 p+ b! V1 u8 }' j) W `
执行结果
# E5 a: [/ K3 C& v
+ R8 v {0 l: {, E5 f————————————————
* B, ?# V' |) c$ v6 L版权声明:本文为CSDN博主「大林子先森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
+ B' F+ i+ b/ t$ A M! J/ k J4 U原文链接:https://blog.csdn.net/liulianglin/article/details/126741594$ g/ p5 \2 B1 [7 P) T3 g4 E- e
& g/ B6 X+ T% }. d
' T0 j" `$ n$ K! [2 Q |
zan
|