排序算法之选择排序

问题定义

问题输入:n个数的一个序列< a1 a 1 , a2 a 2 ,……, an a n >
问题输出:输入序列的一个排列< a1 a 1 ′ , a2 a 2 ′ ,……, an a n ′ >
选择排序的算法过程:首先找出A中的最小元素并将其与A[1]中的元素进行交换。接着,找出A中的次最小元素并将其与A[2]中的元素进行交换。对A中前n-1个元素按该方式继续。该算法被称为选择算法。
根据上述原理,从小到大排序,可以写伪代码如下:

for i=0 to A.length-1
    key=A[i]
    for j=i+1 to A.length
        if(A[j]<key)
            key=A[j]
    if(key!=A[i])
        交换key 和 A[i]
代码
void Select_sort(vector<int>& vec)
{
    int n = vec.size();
    for (int i = 0; i < n-1; i++)
    {
        int key = vec[i];
        int position = 0;
        for (int j = i + 1; j < n; j++)
        {
            if (vec[j] < key)
            {
                key = vec[j];
                position = j;
            }
        }
        if (key != vec[i])
        {
            int temp = vec[i];
            vec[i] = key;
            vec[position] = temp;
        }
    }
}

测试程序

void show(vector<int> vec)
{
    vector<int>::iterator it = vec.begin();
    for (; it != vec.end(); it++)
    {

        cout << *it << " ";
    }
    cout << endl;
}
int main()
{
    vector<int> vec;
    for (int i =5; i >=0; i--)
    {
        vec.push_back(i);
    }
    show(vec);
    Select_sort(vec);
    show(vec);
    return 0;
}
时间复杂度

假定序列<1,2,3,4,5>,按照从小到大的顺序排列,按照算法伪代码,两层循环都执行,不执行交换也不执行移动,即该运行时间是问题规模n的二次函数,故时间复杂度为O( n2 n 2 )。
假定序列<5,4,3,2,1>,按照从小到大的顺序排列,按照算法伪代码,两层循环都执行,既执行交换也执行移动,即该运行时间是问题规模n的二次函数, 故时间复杂度为O( n2 n 2 )。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值