select_sort

select_sort

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>

using namespace std;

//circulation
void select_sort1(int* a, int n) {
	if (n < 2)
		return;
	int p;
	for (int i = 0; i < n - 1; i++) {
		p = i;
		for (int j = i + 1; j < n; j++) {
			if (a[j] < a[p])
				p = j;
		}
		if(p!=i){
			a[i]=a[i]+a[p];
			a[p] = a[i] - a[p];
			a[i] = a[i] - a[p];
		}
	}
	return;
}

//recursion
void select_sort2(int* a,int n) {
	if (n < 2)
		return;
	int p=0;
	for (int j = 1; j < n; j++) {
		if (a[j] < a[p])
			p = j;
	}
	if (p !=0 ) {
		a[0] = a[0] + a[p];
		a[p] = a[0] - a[p];
		a[0] = a[0] - a[p];
	}
	select_sort2(a+1, --n);
}


//optimize_circulation
void select_sort3(int* a, int n) {
	if (n < 2)
		return;
	int minp,maxp;
	int l = 0, r = n-1;

	while(l<r) {
		minp =maxp= l;
		for (int j = l+1; j <= r; j++) {//找到最小下标,最大下标
			if (a[j] < a[minp])
				minp = j;
			if (a[j] > a[maxp])
				maxp = j;
		}

		if (minp != l) {//最下下标不是初始位置,则交换放最前
			a[l] = a[l] + a[minp];
			a[minp] = a[l] - a[minp];
			a[l] = a[l] - a[minp];
		}

		if (maxp == l) maxp = minp;//注意最大下标若为初始值,上一步会换位

		if (maxp != r) {//最大值不是最后位置,则交换放最后
			a[r] = a[r] + a[maxp];
			a[maxp] = a[r] - a[maxp];
			a[r] = a[r] - a[maxp];
		}
		++l;
		--r;
	}
	return;

}

//optimize_recursion
void select_sort4(int* a, int n) {
	if (n < 2)
		return;
	int minp, maxp;
	int l = 0, r = n - 1;
	minp = maxp = l;
	for (int j = l + 1; j <= r; j++) {
		if (a[j] < a[minp])
			minp = j;
		if (a[j] > a[maxp])
				maxp = j;
	}

	if (minp != l) {
		a[l] = a[l] + a[minp];
		a[minp] = a[l] - a[minp];
		a[l] = a[l] - a[minp];
	}

	if (maxp == l) maxp = minp;

	if (maxp != r) {
		a[r] = a[r] + a[maxp];
		a[maxp] = a[r] - a[maxp];
		a[r] = a[r] - a[maxp];
	}

	select_sort4(++a, n - 2);
	return;

}

int main() {
	int a[] = { 44,3,38,5,47,15,36,26,27,2,46,4,19,50,48 };
	
	/*select_sort3(a, sizeof(a) / sizeof(a[0]));
	for (const auto& e : a)
		cout << e << " ";
	cout << endl;*/

	select_sort1(a, sizeof(a) / sizeof(a[0]));
	for (const auto& e : a)
		cout << e << " ";
	cout << endl;

	/*select_sort2(a, sizeof(a) / sizeof(a[0]));
	for (const auto& e : a)
		cout << e << " ";
	cout << endl;
	select_sort4(a, sizeof(a) / sizeof(a[0]));
	for (const auto& e : a)
		cout << e << " ";
	cout << endl;*/
	
	return 0;
}
  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值