标签:sele bsp 时间 排序 越界 排列 效率 col 初始
算法:
1、首先,找到数组中最小的那个元素。
2、其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素,那么它就和自己交换)。
3、再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。
这种方法叫做选择排序,因为它在不断地选择剩余元素之中的最小者。
选择排序的内循环只是在比较当前元素与目前已知的最小元素(以及将当前索引加1和检查是否代码越界),这已经简单到了极点。
交换元素的代码写在内循环之外,每次交换都能排定一个元素,因此交换的总次数是N。所以算法的时间效率取决于比较次数。
复杂度:
对于长度为N的数组,选择排序需要大约N^2/2次比较和N次交换。
0到N-1具体比较次数为(N-1)+(N-2)+……+2+1=N(N-1)/2=N^2/2
选择排序特点:
1、运行时间和输入无关。有序数组和随机排列数组所用排序时间一样长。其它算法会更善于利用输入的初始状态。
2、数据移动是最少的。每次交换都会改变两个数组元素的值,因此选择排序用了N次交换。交换次数和数组大小是线性关系。其他的算法不具备这个特征。
代码实现:
public class Selection { public static void sort(Comparable []a){ int N = a.length; for (int i = 0; i< N; i++){ int min =i; for(int j = i+1;j<N;j++){ if(less(a[j],a[min])){ min =j; } } exch(a,i,min); } } private static boolean less(Comparable v,Comparable w){ return v.compareTo(w)<0; } private static void exch(Comparable[]a, int i, int j){ Comparable t = a[i]; a[i] = a[j]; a[j] = t; } private static void show(Comparable[] a) { for (int i = 0;i<a.length;i++){ System.out.println(a[i]+" "); } } private static boolean isSorted(Comparable []a){ for (int i =1 ;i <a.length;i++){ if(less(a[i],a[i-1])) return false; } return true; } public static void main(String [] args){ Integer a[] ={1,5,3,2,6,8}; sort(a); assert isSorted(a); show(a); } }
参考资料:
《算法》-Sedgewick
标签:sele bsp 时间 排序 越界 排列 效率 col 初始
原文地址:https://www.cnblogs.com/diameter/p/13305074.html