思路:
选择排序法是一种非常直观的算法,它会在计算每个计算步骤中选出一个最小值,进而完成排序。
模板:
selectionSort(A ,N) //包含N个元素的0起点数组A
for i 从 0到 N-1
min=i
for j 从 i到N-1
if A[j] < A[min]
min = j
A[ i ]与A[ min ]交换
_________________________________________
void selectionSort(A[] ,N)
{
int i,j,t,min;
for(i=0;i < N-1;i++)
{
min = i;
for(j = i;j < N;j++)
{
if(A[j] < A[min])
min =j;
}
if( i != min)
{
t = A[ i ];
A[ i ] = A[min];
A[min] = t;
}
}
}
C++模板:
#include<bits/stdc++.h>
using namespace std;
void selectionSort(int a[],int n)
{
int i,j,t,min;
for(i=0;i<n-1;i++)
{
min=i;
for(j=i+1;j<n;j++) //个人喜欢用j=i+1,而不是j=i
{
if(a[j]<a[min])
min=j;
}
if(i!=min)
{
t=a[i];
a[i]=a[min];
a[min]=t;
}
}
}
int main()
{
int a[100],n,i;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
selectionSort(a,n);
for(i=0;i<n;i++)
{
if(i)
cout<<" ";
cout<<a[i];
}
cout<<endl;
return 0;
}
时间复杂度:
由于选择排序法会直接交换两个不相邻的元素,所以属于不稳定的排序算法。
然后再来看看选择排序法的复杂度。假设数据总数为N,那么无论在何种情况下,选择排序法都需要进行(N - 1) + (N - 2) + ··· + 1 = (N2 - N)/2次比较运算,用于搜索未排序部分的最小值。因此该算法的复杂度与N2基本成正比,即复杂度数量级为O(N2)。
现在,让我们回过头来看看这三种排序算法(插入、冒泡、选择),比较一下它们的特征。冒泡排序法与选择排序法相比,一个从局部入手减少逆序元素,一个放眼大局逐个选择最小值,二者思路大不相同。但是,它们又都有着“通过 i 次外层循环,从数据中顺次求出 i 个最小值”的相同特征。相对的,插入排序法是通过 i 次外层循环,直接将原数组的 i 个元素重新排序。另外,不含flag的简单冒泡排序法和选择排序法不依赖数据,即比较运算次数(算法复杂度)不受输入数据的影响,而插入算法在执行时却依赖数据,处理某些数据是具有很高的效率。
例题:
请编写一个程序,读取数列 A,利用选择排序法将其按升序排列并输出。程序中需包含上述伪代码所表示的算法。
另外,请输出程序实际运行过程中执行交换操作(即伪代码第 7 行中 i 与 min不相等的情况)的次数。
输入:在第 1 行输入定义数组长度的整数N。在第 2 行输入 N个整数,以空格区分。
输出:输出总计 2 行。请在第 1 行输出排序后的数列。数列相邻元素用 1 个空格隔开。第 2 行输出交换次数。
限制:1≤ N ≤ 100
0≤ A的元素 ≤ 100
输入示例
6
5 6 4 2 1 3
输出示例
1 2 3 4 5 6
4
C++代码:
#include<bits/stdc++.h>
using namespace std;
int selectionSort(int a[],int n)
{
int i,j,t,sum=0,min;
for(i=0;i<n-1;i++)
{
min=i;
for(j=i;j<n;j++)
{
if(a[j]<a[min])
min=j;
}
if(i!=min)
{
t=a[i];
a[i]=a[min];
a[min]=t;
sum++;
}
}
return sum;
}
int main()
{
int a[100],n,i,sum;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
sum=selectionSort(a,n);
for(i=0;i<n;i++)
{
if(i)
cout<<" ";
cout<<a[i];
}
cout<<endl;
cout<<sum<<endl;
return 0;
}
例题网址:
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_2_B
来源:oschina
链接:https://my.oschina.net/u/4350851/blog/3443101