选择排序是一种非常蠢的方法但是确是很简单的一种方法。
代码如下:
template<class T>
void selectionSort(T a[],int n)
{
for(int size=n;size>1;size--)
{
int j=indexOfMax(a,size)
swap(a[j],a[size-1]);
}
}
template<class T>
int indexOfMax(T a[],int n)
{
int indexOfMax=0;
for(int i=1;i<n;i++)
if(a[indexOfMax]<a[i])
indexOfMax=i;
return indexOfMax;
}
首先找到最大的数的位置然后交换最后一个位置与该位置的数据,然后去除最后一个位置然后重复过程
将剩下最大的数移到剩下数组的最后一个位置,一直重复直到结束。
不过这个选择排序算法还是有点问题,那就是假如当size减少到比如4时,数组就排序好了,但是程序仍然会继续执行下了,知道size减少到1.那么有什么办法让其执行到size=4就停止排序呢?一般的做法是加入一个标志位,通过这个标志位来判断是否排序成功,如果成功就退出循环。代码如下:
template<class T>
void selectionSort(T a[],int n)
{
bool sorted=false;
for(int size=n;!sorted&&(size>1);size--)
{
int indexOfMax=0;
sorted=true;
for (int i=1;i<size;i++)
if(a[indexOfMax]<=a[i]) indexOfMax=i;
else sorted=false;
swap(a[indexOfMax],a[size-1]);
}
}
以上程序添加了一个标志位sorted,如果sorted=true那么最外成while循环就直接结束了。
理解这个代码最关键的就是sorted是如何判断数组是否排序完成的。
关键就在第二个for循环,当a[indexOfMax]<=a[i]的时候,indexOfMax就会更新为i的值,如果数组是排好序的
比如a=[1,2,3,4,5],初始化indexOfMax=0;a[0]<a[1],indexOfMax=1,a[1]<a[2].......,你会发现数组的前一个元素总是小于后一个数据所以if判断一直成立,那么sorted就会等于true,那么最外层循环就结束了。一旦出现数组前面的元素大小后面的情况即数组没排好序,那么就会执行else语句,sorted=false,最外层循环继续执行。