排序--选择排序
选择排序
概念:首先在未排序的数列中选择第一个元素,假设为最小值,然后遍历剩下的元素,与第一个元素比较;如果遍历中的元素小于最小值,则将最小值与该值交换,继续遍历。直到数列所有元素都被排序。
优点:与数据移动相关。如果某个元素在其最终位置上,那么它不会移动。选择排序每次交换一对元素,就有一个元素被移动到其最终位置上,所以最多可能进行n-1次交换。
Java 代码实现
1 public class Selection 2 { 3 4 public static void main(String[] args) 5 { 6 Integer[] arr ={112,33,5,3,22,33,44,33,56,3,1,34,7,5,5,78,7,533,}; 7 selectionSort(arr); 8 for(Integer i: arr) 9 { 10 System.out.print(i+" "); 11 } 12 } 13 public static <T extends Comparable<? super T>>void selectionSort(T[] arr){ 14 T minKey; 15 int minIndex; 16 //从1开始寻找比min更小的元素 17 for(int i = 0; i < arr.length; i++) 18 { 19 //假定第一个元素为最小值 20 minIndex = i; 21 //从1开始寻找比min更小的元素 22 for(int j = minIndex+1; j < arr.length; j++) 23 { 24 //比较次数:n+(n-1)+n-2+...+2+1 = n(n-1)/2 25 if(arr[j].compareTo(arr[minIndex]) < 0){ 26 minIndex = j; 27 } 28 } 29 //找到遍历一次的最小值,进行交换 30 //交换次数:0~(n-1)次之间 31 minKey = arr[minIndex]; 32 arr[minIndex] = arr[i]; 33 arr[i] = minKey; 34 } 35 } 36 }
复杂度分析
比较次数:n+(n-1)+(n-2)+...+2+1 = n(n-1) / 2;
时间复杂度:O(n^2)
交换次数:0~(n-1)
赋值次数:0~3(n-1)
因为交换所需要的cpu时间比比较所需要的时间多,而且选择排序比冒泡排序交换次数少了很多。
所以当n值较小的时候,选择排序快于冒泡排序。