C/C++版选择排序

选择排序实现如下:

#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】。

这个简单的例子,就已经充分说明了选择排序的原理:依次选出每一部分的最大值,将之依次放到每一部分的最左边,就好似力气最大的人站在最左边,力气第二大的人站在力气最大的人的后面,力气第三大的人站在力气第二大的人的后面…依次排列,于是这个队伍最后就按照力气从大到小的顺序进行排列了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值