选择排序

选择排序(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的增大,算法的时间增长很快。因此使用时需要特别注意。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值