一种最简单的排序算法是这样的:首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置 (如果第一个元素就是最小元素那么它就和自己交换)。再次,在剩下的元素中找到最小的元素,将它与数组的第三个元素交换位置。如此往复,直到将整个数组排序。这种方法叫做选择排序,因为它在不断地选择剩余元素之中的最小者。
如算法代码所示,选择排序的内循环只是在比较当前元素与目前已知的最小元素(以及将当前索引加1和检查是否代码越界),这已经简单到了极点。交换元索的代码写在内循环之外,每次交换都能排定一个元素,因此交换的总次数是N。所以算法的时间效率取决于比较的次数。
总的来说,选择排序是-种很容易理解和实现的简单排序算法,它有两个很鲜明的特点。
运行时间和输入无关。为了找出最小的元索而扫描一遍数组并不能为下- -遍扫描提供什么信息。这种性质在某些情况下是缺点,因为使用选择排序的人可能会惊讶地发现,一个已经有序的数组或是主键全部相等的数组和一个元索随机排列的数组所用的排序时间竟然样长!我们将会看到,其他算法会更善于利用输人的初始状态。
数据移动是最少的。每次交换都会改变两个数组元素的值,因此选择排序用了N次交换一交换次数和数组的大小是线性关系。我们将研究的其他任何算法都不具备这个特征(大部分的增长數量级都是线性对数或是平方级别)。
/* * 选择排序: 3,1,5,2,4,9,6,8,7 * 稳点性差 */ public class SelectSort { public static void selectSort(int [] x) { if(x.length!=0) { int temp = 0; for(int i = 0;i<x.length;i++) { int min = i; for(int j = i;j<x.length;j++) { if(x[j] <= x[min]) { min = j; } } temp = x[min]; x[min] = x[i]; x[i] = temp; } } } public static void main(String[] args) { int [] arr = {3,1,5,2,4,9,6,8,7}; System.out.print("原始数组是:"); for(int a :arr) { System.out.print(a+","); } selectSort(arr); System.out.println(); System.out.print("排序之后的数组是:"); for(int i = 0;i<arr.length;i++) { System.out.print(arr[i]+","); } } }