概念
通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换
Java代码实现
public static void select(Integer[] array) { int min; for (int i = 0; i < (array.length-1); i++) { min = i; for (int j = i+1; j < array.length; j++) { if (array[min] > array[j]) min = j; } // end for compare length-i+1 elements // find the smallest element and swap with ith element if (i != min) Helper.swap(array, i, min); } // end for loop length-1 times }
每一次比较并不替换,只是记录下较小值的位置,知道内循环完成,找到最小值,再替换
时间复杂度分析
最好情况,初始已为有序序列,需比较n(n-1)/2次,移动0次,时间复杂度为O(n2)
最差情况,初始为倒序序列,需比较n(n-1)/2次,移动n-1次,时间复杂度为O(n2)
最好情况和最坏情况的时间复杂度相同,主要是比较次数相同,应该可以用一个标记来优化。
同冒泡排序算法比较,由于移动次数较少,所以总体要略优于冒泡排序
空间复杂度分析
所需要的辅助空间为O(1)