选择排序和二元选择排序

选择排序

思想: 在一个数组中,找到最小的数放在最前面,然后再在剩下的数中找到最小的放到第二位....以此类推

代码实现:

#include<iostream>
using namespace std;

void swap(int& x, int& y)//交换函数
{
	int temp = 0; temp = x; x = y; y = temp;
}
void print(int* a, int len,int i)//输出函数
{
	cout << "第" << i + 1 << "趟:";
	for (int i = 0; i < len; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
}
void SelectSort(int* a, int len)//选择排序
{
	for (int i = 0; i < len; i++)
	{
		for (int j = i + 1; j < len; j++)//如果a[i]>a[j]则交换其值,一轮循环后a[i]已经是最小值
		{
			if (a[j]<a[i])
			{
				swap(a[j], a[i]);
			}
		}
		print(a, len, i);
	}
}
int main()
{
	int a[10] = { 16,22,3,96,45,26,107,99,1,10 };
	int len = sizeof(a) / sizeof(a[0]);//求数组的长度
	SelectSort(a,len);
	return 0;
}

运行结果:

:

二元选择排序

 

思想:在每层循环时找到最小值放在最前面,最大值放在最后面,去掉这两个数继续此步骤直至结束

代码实现:

void BinarySelectSort1(int* a, int len)//二元选择排序
{
	int x = len;//因为len的值会改变,所以定义x来表示长度,方便print
	for (int i = 0; i < len; i++, len--)//每层循环后去掉最大最小继续比较,因为每次循环len--,实际循环次数<=n/2
	{
		for (int j = i + 1; j < len; j++)//从a[i+1]到a[len-1]与a[i]比较,找到最小值置前
		{
			if (a[j] < a[i])
				swap(a[j], a[i]);
		}
		for (int k = len - 2; k > i; k--)//从a[len-2]到a[i+1]与a[len-1]比较,找到最大值置后
		{
			if (a[k] > a[len - 1])
				swap(a[k], a[len - 1]);
		}
		
		print(a, x,i);
	}
}

运行结果:

改进:用max和min来标记最大值和最小值的下标,直到遍历结束后找到当前遍历区域的最大值与最小值的下标然后再进行交换

代码实现:

void BinarySelectSort(int* a, int len)
{
	int x = len;
	int max, min;
	for (int i = 0; i < len; i++, len--)//每层循环后去掉最大最小继续比较
	{
		int min = i;
		int max = len - 1;
		for(int j = i+1; j < len-1; j++)
		{
			if (a[j] < a[min])
				min = j;
			if (a[j] > a[max])
				max = j;	
		}
		swap(a[min], a[i]);
		swap(a[max], a[len - 1]);
		print(a, x, i);
	}
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值