基本概念:
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
基本思想:
每轮找一个最大(小)值。
在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换…第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成。
复杂度分析:
空间效率:仅用了一个辅助交换单元。
O
(
n
)
O(n)
O(n)
选择排序最好(正序无交换)为
O
(
n
)
O(n)
O(n) 。
选择排序的最坏(倒序)为
O
(
n
2
)
O(n^2)
O(n2)。
选择排序的平均(乱序)为
O
(
n
2
)
O(n^2)
O(n2)。
选择排序是不稳定的。
#include<bits/stdc++.h>
using namespace std;
void f(int a[],int n)
{
int i,j,temp;
for(i=1; i<n; i++) //从第一个位置开始
{
temp=i;
for(j=i+1; j<=n; j++)
{
if(a[j]<a[temp]) temp=j; // 查找最小数的位置
}
if(temp!=i) // 如果a[i]不是最小数
swap(a[i],a[temp]);
}
}
int main()
{
int n,i,a[100010];
scanf("%d",&n);
for(i=1; i<=n; i++) scanf("%d",&a[i]);
f(a,n);
for(i=1; i<=n; i++) printf("%d ",a[i]);
return 0;
}