直接选择排序概述
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
实例演示
这里我们将选择排序更有效一点,一次遍历找到最小,最大的值分别放在begin,end位置
实现代码
升序
#include<iostream>
using namespace std;
#include<vector>
void SelectSort(vector<int>& a,int n)
{
int begin=0,end=n-1;
while(begin<end)
{
int mini=begin,maxi=end;
for(int i=begin;i<=end;i++)
{
if(a[i]>a[maxi])
maxi=i;
if(a[i]<a[mini])
mini=i;
}
swap(a[begin],a[mini]);
if(begin==maxi)//注意这里判断条件
{
maxi=mini;
}
swap(a[end],a[maxi]);
++begin;
--end;
}
}
int main()
{
int n;
cin >> n;
vector<int> a;
while (n--)
{
int k;
cin >> k;
a.push_back(k);
}
SelectSort(a, a.size());
for (auto e : a)
{
cout << e << " ";
}
return 0;
}
结果:
降序
#include<iostream>
using namespace std;
#include<vector>
void SelectSort(vector<int>& a,int n)
{
int begin=0,end=n-1;
while(begin<end)
{
int mini=begin,maxi=end;
for(int i=begin;i<=end;i++)
{
if(a[i]>a[maxi])
maxi=i;
if(a[i]<a[mini])
mini=i;
}
swap(a[end],a[mini]);
if(end==maxi)
{
maxi=mini;
}
swap(a[begin],a[maxi]);
++begin;
--end;
}
}
int main()
{
int n;
cin >> n;
vector<int> a;
while (n--)
{
int k;
cin >> k;
a.push_back(k);
}
SelectSort(a, a.size());
for (auto e : a)
{
cout << e << " ";
}
return 0;
}
结果:
直接选择排序的特性总结:
- 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用。
- 时间复杂度:O(N^2)
- 空间复杂度:O(1)
- 稳定性:不稳定