排序算法之选择排序

问题定义

问题输入:n个数的一个序列< a 1 , a 2 ,……, a n >
问题输出:输入序列的一个排列< a 1 , a 2 ,……, 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( n 2 )。
假定序列<5,4,3,2,1>,按照从小到大的顺序排列,按照算法伪代码,两层循环都执行,既执行交换也执行移动,即该运行时间是问题规模n的二次函数, 故时间复杂度为O( n 2 )。

猜你喜欢

转载自blog.csdn.net/u013266600/article/details/80757401