![Java常用算法手册(第3版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/106/31729106/b_31729106.jpg)
4.3 选择排序算法
选择排序(Selection Sort)算法也是比较简单的排序算法,其思路比较直观。选择排序算法在每一步中选取最小值来重新排列,从而达到排序的目的。
4.3.1 选择排序算法
选择排序算法通过选择和交换来实现排序,其排序流程如下:
(1)首先从原始数组中选择最小的1个数据,将其和位于第1个位置的数据交换。
(2)接着从剩下的n-1个数据中选择次小的1个数据,将其和第2个位置的数据交换。
(3)然后不断重复上述过程,直到最后两个数据完成交换。至此,便完成了对原始数组的从小到大的排序。
为了更好地理解选择排序算法的执行过程,下面举一个实际数据的例子来一步一步地执行选择排序算法。5个整型数据118、101、105、127、112是一组无序的数据。对其执行选择排序过程,如图4-4所示。
![](https://epubservercos.yuewen.com/FCD0C8/17180245404473706/epubprivate/OEBPS/Images/img00133001.jpg?sign=1738893842-E5noOmkYVvkBLJWXp63ruxle7kY92ayR-0-ead7276974212ac532ce4227faef0e63)
图4-4 选择排序算法的执行过程
选择排序算法的执行步骤如下:
(1)第1次排序,从原始数组中选择最小的数据,这个数据便是101,将其与第1个数据118进行交换。此时排序后的数据为101、118、105、127、112。
(2)第2次排序,从剩余的数组中选择最小的数据,这个数据便是105,将其与第2个数据118进行交换。此时排序后的数据为101、105、118、127、112。
(3)第3次排序,从剩余的数组中选择最小的数据,这个数据便是112,将其与第3个数据118进行交换。此时排序后的数据为101、105、112、127、118。
(4)第4次排序,从剩余的数组中选择最小的数据,这个数据便是118,将其与第4个数据127进行交换。此时排序后的数据为101、105、112、118、127。
从上面的例子可以非常直观地了解到选择排序算法的执行过程。选择排序算法在对n个数据进行排序时,无论原数据有无顺序,都需要进行n-1步的中间排序。这种排序方法思路很简单直观,但是缺点是执行的步骤稍长,效率不高。
选择排序算法的示例代码如下:
![](https://epubservercos.yuewen.com/FCD0C8/17180245404473706/epubprivate/OEBPS/Images/img00133002.jpg?sign=1738893842-usmIOQbL2Alm9IMS8Wh0ehpn3OoutBCy-0-b363d37c8fae0fb6a1afd1f69d23016c)
![](https://epubservercos.yuewen.com/FCD0C8/17180245404473706/epubprivate/OEBPS/Images/img00134001.jpg?sign=1738893842-UkGKDkp0GcfUMngGtRa4p3n81iFD5pFn-0-b955130cab9ba9f14f7bf2f57c3d0cd9)
在上述代码中,输入参数a一般为一个数组的首地址。待排序的原数据便保存在数组a中,程序中通过两层循环来对数据进行选择排序。读者可以结合前面的选择排序算法来加深理解。这里,为了让读者清楚排序算法的执行过程,在排序的每一步都输出了当前的排序结果。
4.3.2 选择排序算法实例
学习了前面的选择排序算法的基本思想和算法之后,下面通过一个完整的例子来说明选择排序法在整型数组排序中的应用,程序示例如下:
【程序4-2】
![](https://epubservercos.yuewen.com/FCD0C8/17180245404473706/epubprivate/OEBPS/Images/img00134002.jpg?sign=1738893842-YLeqz7PRXtxcQkdLtSO94ZPjx5S7t5tc-0-232ecf81667939053f8e05f7a10ee455)
![](https://epubservercos.yuewen.com/FCD0C8/17180245404473706/epubprivate/OEBPS/Images/img00135001.jpg?sign=1738893842-IH1PXXmPLXPHKGxjZom3XssncWSuQjGW-0-ee09cc046cbcd970c1c5eabacf776707)
在上述代码中,程序定义了符号常量SIZE,用于表征需要排序整型数组的大小。在主方法中,首先声明一个整型数组,然后对数组进行随机初始化,并输出排序前的数组内容。接着,调用选择排序算法方法来对数组进行排序。最后,输出排序后的数组。
该程序的执行结果,如图4-5所示。图中显示了每一步排序的中间结果。
![](https://epubservercos.yuewen.com/FCD0C8/17180245404473706/epubprivate/OEBPS/Images/img00135002.jpg?sign=1738893842-PPO0xk2Or8chl72X0cevMUcnLyV6eTJt-0-90545cca1749c94a33f90bff4badcc44)
图4-5 执行结果