选择排序(Selection sort)也是一种简单直观的排序算法。
思想:
还是先来看看选择排序的思想。选择排序的思想非常直接,从所有序列中先找到最小的,然后放到第一个位置。之后再看剩余元素中最小的,放到第二个位置……以此类推,就可以完成整个的排序工作了。可以很清楚的发现,选择排序是固定位置,找元素。相比于插入排序的固定元素找位置,是两种思维方式。
算法步骤:
1)首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
2)再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
3)重复第二步,直到所有元素均排序完毕。
假如一个3,2,1,6,4,5的排序,代码如下:
template<class T>
void SelectSort(T a[], int len)
{
T temp;
int nIndex=0;
//每次循环只进行一次交换 最多进行len-1次循环,因此总体上,比冒泡进行交换的次数少
for (int i=0;i<len-1;i++)
{
//第i次排序时,已经进行了i次大循环,因此已经排好了i个元素
//已排好序的元素0,,...,i-2,i-1
// 待排元素为i,i+1,...,len-1
nIndex=i;
for (int j=i+1;j<len;j++)
{
if (a[j]<a[nIndex])
{
nIndex=j;
}
}
//交换
if (nIndex!=i)
{
temp=a[i];
a[i]=a[nIndex];
a[nIndex]=temp;
}
}
}
由上面简单的例子,可以看到,选择排序的大致过程如下:
for(int i=0; i<v.size(); i++){
int min = v[i];
int temp;
int index = i;
for(int j=i+1;j<v.size();j++){
if(v[j] < min){
min = v[j];
index = j;
}
}
temp = v[i];
v[i] = min;
v[index]= temp;
}
分析
从选择排序的思想或者是上面的代码中,我们都不难看出,寻找最小的元素需要一个循环的过程,而排序又是需要一个循环的过程。因此显而易见,这个算法的时间复杂度也是O(n*n)的。这就意味值在n比较小的情况下,算法可以保证一定的速度,当n足够大时,算法的效率会降低。并且随着n的增大,算法的时间增长很快。因此使用时需要特别注意。