【选择排序】

来源:互联网 发布:python ipython 编辑:程序博客网 时间:2024/05/20 00:50
public static void selectionSort(int[] a){int nElems = a.length;int out,in,min;for(out=0;out<nElems-1;out++){min = out;for(in=out+1;in<nElems;in++){if(a[in]<a[min])min = in;}if(out!=min){int temp = a[out];a[out] = a[min];a[min] = temp;}}}

基本思路:

从代码中我们可以看出,外层循环变量out从初始位置0开始,逐步递增,最大到第nElems-1个数位,对应角标位nElems-2。内层循环,在网外层循环out的基础上加1,而后逐步递增,最大到数组的最大位,对应角标为nElems-1。在进行比较时,会将最小的数的角标存入到min变量中,当结束内层循环时,将out位的数值与最小角标处的数值进行交换,这样out位往左,都是有序的,从小到大。


时间复杂度:

数组元素个数是N,第一轮中共比较了N-1次,接下来逐次递减1,那么比较的次数是:
(N-1)+(N-2)+(N-3)+...+1 = N*(N-1)/2 = O(N^2)

如果数组元素顺序恰好是由小到大,那么交换的次数最小为0,如果顺序是由大到小,那么便是交换的最多的次数,与外层循环次数相同,因此,最坏的情况下交换次数为:
(N-1)/2 = O(N)
由此可以得出这样的结论,选择排序的平均时间复杂度为O(N)


算法稳定性:

选择排序是一个不稳定的排序算法。参照网上的例子:

对数组[5, 3, 5, 2, 6]进行选择排序时,我们知道,在第一轮比较时,会将元素2的角标标记为最小,而后,将第一个元素5与元素2进行互换,这样数组中的两个元素5的前后位置就发生了改变。由此,选择排序是不稳定的排序算法。


算法不变性:

使用这个算法进行排序时,数组下标小于等于out位置的元素都是有序的。


本文首次发表于依鹏csdn博客,转载请注明出处:http://blog.csdn.net/m0_37240709/article/details/78038358



原创粉丝点击