选择排序实现如下:
#include <iostream>
#include <string>
using namespace std;
constexpr int _Greater_ = 0;//从大到小排序的指示码
constexpr int _Less_ = 1;//从小到大排序的指示码
//选择排序
template<typename DataType>
void selectionSort(DataType *array,int len,int comp){
//从大到小
if(comp == _Greater_){
//循环去找每一趟的相对最大值,依次将各个最大值放到数组左边,达到从大到小排序
for(int j = 0;j < len - 1;++j){
DataType maxValue = array[j];
DataType maxValueIndex =j;
//选择最大值,并放到数组的最左边
for(int i = j;i < len;++i){
if(array[i] > maxValue){
maxValue = array[i];
maxValueIndex = i;
}
}
//将找寻到的此趟最大元素与最左边的元素进行交换,即:将最大值放到数组最左边
DataType temp = array[maxValueIndex];
array[maxValueIndex] = array[j];
array[j] = temp;
}
}
//从小到大
if(comp == _Less_){
//循环去找每一趟的相对最小值,依次将各个最小值放到数组左边,达到从小到大排序
for(int j = 0;j < len - 1;++j){
DataType minValue = array[j];
DataType minValueIndex =j;
//选择最小值,并放到数组的最左边
for(int i = j;i < len;++i){
if(array[i] < minValue){
minValue = array[i];
minValueIndex = i;
}
}
//将找寻到的此趟最小元素与最左边的元素进行交换,即:将最小值放到数组最左边
DataType temp = array[minValueIndex];
array[minValueIndex] = array[j];
array[j] = temp;
}
}
}
int main(int argc,const char *argv[]){
int array[] = {9,8,7,70,80,30,2,7,11,0};
selectionSort(array,sizeof(array)/sizeof(int),_Greater_);
for(int i = 0;i < sizeof(array) / sizeof(int);++i){
cout<<array[i]<<" ";
}
cout<<endl;
return EXIT_SUCCESS;
}
上述选择排序接口的使用方法:selectionSort(参数1,参数2,参数3),其中参数1是指需要被排序的数组,参数2是指该数组的长度,参数3是指排序的顺序(即从大到小或从小到大),该顺序由上述自定义的指示码决定。
选择排序的思路(以从大到小顺序为例):
选出数组中最大的项,并将之与第一项交换(或称之为将最大项放到数组的最左边),然后再选出剩余那一部分元素中的最大值,将之放到剩余这一部分数组的最左边…依次进行上述的操作,直至将所有区段的最大元素都放到了相应区段的最左边为止,此刻排序结束,结果为从大到小顺序排列。
例如(以数组a:【1 0 200】为例):
第一趟:找到数组a中的最大项(即上述数组a中值为200的项),将此项与数组a中的首项(即值为1的项)交换。结果,数组a变为:【200 0 1】。
第二趟:取数组a中的【0 1】为新的目标数组(因为第一趟我们已经将数组a中的最大项放到了最左边,接下来我们要在除该最大项外的次最大项,所以我们现在要操作的目标已经不是数组a,而是数组a中出首项之外的部分数组),同样,对于【0 1】我们也做与第一趟一样的操作(找其中的最大值项,进行与首项的交换),于是我们找到其中的最大值项(即值为1的项),然后将该项与该部分数组中的首项(即值为0的项)进行交换。结果,该部分数组变为【1 0】。
第三趟:同样,再次得到新的部分数组【0】,同样找寻其中的最大值项,由于此时数组长度为1(只有一个元素),所以它的最大值项就是0。
通过上述三趟过程,数组a从原先的【1 0 200】变成了【200 1 0】。
这个简单的例子,就已经充分说明了选择排序的原理:依次选出每一部分的最大值,将之依次放到每一部分的最左边,就好似力气最大的人站在最左边,力气第二大的人站在力气最大的人的后面,力气第三大的人站在力气第二大的人的后面…依次排列,于是这个队伍最后就按照力气从大到小的顺序进行排列了。