算法思想:
排序数组内元素由小到大:
1.每一趟从序列中选出最大的元素,然后与末尾的元素对调(决定了此排序是不稳定的,因为有可能把原位置元素调换到与和它等值的元素前面)。
2.重复1的动作,把上一部调换到末尾的元素排除在外。
3.当只剩下第一个元素时,排序完毕。
时间复杂度:
设共有n个元素
最好情况,原来数组元素正好是排好序的,则第i次扫描的比较次数是Ci=n-i,i=0,1,2...(n-1),数据移动次数是Mi=0
所以比较次数总数Cmax=n(n-1)/2
所以选择排序最好的时间复杂度是O(n2),比冒泡排序要坏(其实我有点怀疑冒泡排序用一个变量记录没有反序的情况是否也可以放到选择排序里面来)。
最坏情况,原来数据正好是逆序的,则第i次扫描的比较次数是Ci=n-i,i=0,1,2...(n-1),数据移动次数是Mi=3
所以比较次数总数Cmax=n(n-1)/2
数据移动次数是Mmax=3n
总的次数为Cmax+Mmax=3n+n(n-1)/2,比冒泡排序要好,因为移动次数少了。
所以选择排序最坏的时间复杂度也是O(n2)
下面给出C#的通用选择排序算法:
startIndex为排序区间的数组元素下标,通常为0,
endIndex为排序区间的数组元素下标,通常为array.Length-1
public class SelectionSort<T> where T : IComparable<T> { public void Sort(T[] array, int startIndex, int endIndex) { for (int i = endIndex; i >= startIndex; i--) { int maxIndex = startIndex; for (int j = startIndex; j <= i; j++) { if (array[j].CompareTo(array[maxIndex]) >= 0) { maxIndex = j; } } T tmp = array[i]; array[i] = array[maxIndex]; array[maxIndex] = tmp; } } }
作者:Andy Zeng
欢迎任何形式的转载,但请务必注明出处。