排序--选择排序

选择排序

概念:首先在未排序的数列中选择第一个元素,假设为最小值,然后遍历剩下的元素,与第一个元素比较;如果遍历中的元素小于最小值,则将最小值与该值交换,继续遍历。直到数列所有元素都被排序。

优点:与数据移动相关。如果某个元素在其最终位置上,那么它不会移动。选择排序每次交换一对元素,就有一个元素被移动到其最终位置上,所以最多可能进行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值较小的时候,选择排序快于冒泡排序。

原文地址:https://www.cnblogs.com/wangziqiang/p/3611781.html