经典算法(6)- 选择排序(Selection Sort)
选择排序的基本思想是每次从右边未排好序的元素中找出最小的元素,然后将该元素和左边已经排好序的元素中最大的元素(它位于左边元素序列的最右端) 交换,这样每次交换都将一个元素排好序。 总的比较操作次数为(n-1) + (n-2) + ... + (1)=n(n-1)/2;总的交换操作为n-1(所以相对其他的排序算法,它的交换操作次数比较少)。
注意选择排序的一个缺点是,它是不稳定的(unstable),比如对序列(a,b,c,d),设a=b,d = min(b,c,d),那么第一次选择到最小元素d之后需要交换:a<->d,得到的结果为(d,b,c,a),因为a=b,原来a和b的位 置(a...b)经过第一次交换后变成了(b...a),所以不稳定。
实现:
/** * * @author ljs * * Selection Sort: O(n^2) * */ public class SelectionSort { public static void solve(int[] A){ int n = A.length; for(int i=0;i<n-1;i++){ //only need to record the index m; //don't save the min value of A[m] int m = i; for(int j=i+1;j<n;j++){ if(A[j]<A[m]){ m = j; } } if(m>i){ //swap A[m] and A[i] int tmp = A[m]; A[m] = A[i]; A[i] = tmp; } } } public static void main(String[] args) { int[] A= {1,3,10,9,2,7,19,5,20,4,8,11}; SelectionSort.solve(A); for(int i=0;i<A.length;i++){ System.out.format(" %d", A[i]); } } }
测试(输入序列: 1,3,10,9,2,7,19,5,20,4,8,11):
输出: 1 2 3 4 5 7 8 9 10 11 19 20