1,算法描述
选择排序(Selection-sort),首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
2,实现步骤
- 初始状态:无序区为R[1..n],有序区为空;
- 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R交换,使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
- n-1趟结束,数组有序化了。
实现
1 private static void selectionSort(int[] a) { 2 long start = System.nanoTime(); 3 int len = a.length; 4 int minIndex = 0; 5 for(int i = 0; i < len - 1; i++){//循环n-1次,每次从未排序序列中找个最小值交换到已排序序列尾部 6 minIndex = i; 7 for(int j = i; j < len -1; j++){//从未排序的序列中找到最小值 8 if(a[minIndex] > a[j]){ 9 minIndex = j; 10 } 11 } 12 swap(a,minIndex,i);//把找到的最小值换到已排序序列的尾部 13 } 14 long end = System.nanoTime(); 15 System.out.println((end - start)/1000.0 + "us"); 16 } 17 18 private static void swap(int[] a, int j, int i) { 19 int temp = a[j]; 20 a[j] = a[i]; 21 a[i] = temp; 22 }
3,算法分析
时间复杂度:
最佳情况:T(n) = O(n^2)
最差情况:T(n) = O(n^2)
平均情况:T(n) = O(n^2)
空间复杂度:
占用常数的额外空间,所以空间复杂度为O(1)
稳定性:不稳定
参考:
http://www.cnblogs.com/eniac12/p/5329396.html