' M* y5 [5 q" |选择排序概念6 i* c7 }2 O- m6 t; O
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 --form baike ' B' T. t4 v* t Q% i1 Q _0 L5 ] 2 U$ N, I# J4 a) F# {9 f* b; e9 z7 U思想+ |8 C9 G2 `5 `% c/ ^ g
* 每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置 0 F6 P+ t+ ^# t: L6 F! g. y* 长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换; & q; w; v1 h) @% Y* 当进行下一次排序时,范围缩小1# b3 i L6 W9 @% U5 w% l
0 o5 D- s1 e7 J. {. M代码实现 7 E: F, Y/ e# Y7 f4 m) Ypackage com.lll.datastructure.sort;$ H$ t, S( J+ f0 c/ Q/ L" A
% N4 t7 z) R3 K7 o6 s9 h% H1 P' Q
import java.util.Arrays; ( f' C/ {1 c/ y; c8 C( q / U2 O1 o0 m6 v/** 1 U6 g- T# w2 ]5 Q * * M! E+ q. S4 G0 F* @ClassName: SelectionSort- F1 J# M3 _# l# _8 d
* @Description: 选择排序 3 Y& f: `2 K# u% t; T* @Author: liulianglin8 M7 ~ C: ~; R0 [" Z4 a( [5 z
* @DateTime 2022年9月7日 上午9:12:13: D' V- [) @( N. G5 i0 W5 w
* # N* k5 {9 m- h. V* 选择排序思想: 5 h$ s% Q# M9 r! `" F& Q# D5 ~* 每次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始或末尾位置 + Y e+ A* F8 E5 T+ z7 }* 长度为n的数组一共需要进行n-1趟排序,每趟排序会进行一次值的交换; 2 k- I _/ w4 e- o1 C! i2 E 当进行下一次排序时,范围缩小1 * p) B8 e4 }' i6 N: }4 `5 y */( O: }5 _& M+ E- Y
public class SelectionSort { / w3 O; J& F4 Z7 H) S public static void main(String[] args) { J# G/ f! S6 `3 z, f- \# L // 待排序数据; h* ]3 c2 ]3 M( ]) ^: [+ H( k
int[] arr = {1,3,2,4,7,54,11,34,9}; & Y; O1 d+ U3 C2 W) P) X 8 t# G9 j+ ?* }7 G9 Q6 w0 X8 o6 ]
// 记录当前趟数查找到的最大值的数组下标 ) {# D( T# G; i" o0 i5 d
int max; 0 R4 T/ D' j' X. n8 Y/ y 1 l q) N6 F. v: J7 f+ Y // 交换变量 " }( i* }& @$ A# ^+ }; C8 Y, U6 G- U int temp; + s$ C) `' S; x b ! s- J8 ^* z: k. @( v& t
System.out.println("排序前:" + Arrays.toString(arr));' N' Z: `# o' f5 }
/ x+ c! b4 Q8 G. @- {+ O // 外层控制循环需要排序的趟数, {. d" f( A1 H
for(int i = 0; i < arr.length - 1; i++) { / P% I$ o* y9 D( Y // 每一趟都默认数组第一个元素为最大值0 R: t. L; z C" w6 {
max = 0;- R7 H# ~) G ]; T8 u8 o6 W
3 G8 W4 K1 Z5 h2 a6 A // 内循环控制遍历数组的个数(每趟减1),并得到最大数的下标. x) O. ]/ }) f d: ~
for (int j = 0; j < arr.length - i; j++) { 6 t1 ?4 A' T, K9 s if (arr[j] > arr[max]) {% k& a+ @$ o5 `
max = j; . }. S# O4 w- U' c' C }8 i, D) V9 ]4 h5 f) ~; S2 N
}: [6 `2 r3 f9 y' ~
7 F$ K. C3 l# Z1 F- g2 p // 将交换变量设置为最大值, 将最大值暂存一下 7 u% o# X5 D/ B4 t. p8 h* M( j, @: w temp = arr[max];7 O. x2 v9 Y! K7 _) O( X' d" {
// 将当前最大值设置为当前未排序序列的最后一个元素值 0 v( R, Q. G9 q arr[max] = arr[arr.length - 1 - i];! e3 s% t( Z; J# X( }
// 将刚才缓存的最大值,设置为当前未排序队列的最后一个元素,完成交换- Z$ h+ c) ?3 E0 Z1 z
arr[arr.length - 1 - i] = temp; # f: W* }6 ^& S }5 r3 U) u( z: s* N, x