问题定义
问题输入:n个数的一个序列<
a1
a
1
,
a2
a
2
,……,
an
a
n
>
问题输出:输入序列的一个排列<
a′1
a
1
′
,
a′2
a
2
′
,……,
a′n
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
)。