【C++】泛型的冒泡排序

1.普通的整型冒泡排序

void BubbleSort(int *a,int size)
{
	int k = 0;
	for (int i = 0; i < size - 1; i++)
	{
		for (int j = 0; j < size - 1 - i; j++)
		{
			if (a[j]<a[j + 1])
			{
				k = a[j];
				a[j] = a[j + 1];
				a[j + 1] = k;
			}
		}
	}
}

2.上面的函数只能对整数进行排序,而且只能按照降序排列,我们可以通过泛型编程的形式实现一个可以对多种类型进行排序的函数

enum         //枚举类型
{
	Desc  //降序 0
	,Asc  //升序 1
};
template <class T>              //泛型可指定升降序的冒泡排序
void Sortbubble(T *a,int size,bool ret=1)
{
	int k;
	if (ret==0)
	{
		for (int i = 0; i < size - 1; i++)
		{
			for (int j = 0; j < size - 1 - i; j++)
			{
				if (a[j]<a[j + 1])
				{
					k = a[j];
					a[j] = a[j + 1];
					a[j + 1] = k;
				}
			}
		}
	}
	else
	{
		for (int i = 0; i < size - 1; i++)
		{
			for (int j = 0; j < size - 1 - i; j++)
			{
				if (a[j]>a[j + 1])
				{
					k = a[j];
					a[j] = a[j + 1];
					a[j + 1] = k;
				}
			}
		}
	}
}
测试上述函数

int main()
{
	int arr[] = { 9, 8, 0, 7, 6, 5, 4, 3, 2, 1 };
	Sortbubble(arr, sizeof(arr) / sizeof(arr[0]),Desc);    //降序排列
	//Sortbubble(arr, sizeof(arr) / sizeof(arr[0]), Asc);    //升序排列
	//Sortbubble(arr, sizeof(arr) / sizeof(arr[0]));  
	for (int i = 0; i < 10; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;

	char arr2[] = "cbadfe";
	Sortbubble(arr2, strlen(arr2),Desc);
	cout << arr2 << endl;

	double arr3[]={6.5,4.3,8.5,1.2,4.1};
	Sortbubble(arr3,sizeof(arr3) / sizeof(arr3[0]));
	for (int i = 0; i < 5; i++)
	{
		cout << arr3[i] << " ";
	}
	cout << endl;

	system("pause");
	return 0;
}

结果为



3.上述函数的代码复用率不高,升序与降序只有一个符号不同,我们可以再写一个可以排升序降序、多种类型数据并且代码复用率高的函数

template<class T>
struct Less   //降序
{
	bool operator()(const T&left,const T&right)
	{
		if (left < right)
			return true;
		return false;
	}
};
template<>       //特化降序类,使指针数组类型也可以传参进行排序
struct Less<char*>
{
	bool operator()(const char*left,const char*right)
	{
		if (strcmp(left,right)<0)
			return true;
		return false;
	}
};
template<class T>
struct Rise
{
	bool operator()(const T&left,const T&right)
	{
		if (left>right)
			return true;
		return false;
	}
};

template<>             //特化降序类,使指针数组类型也可以传参进行排序
struct Rise<char*>
{
	bool operator()(const char*left,const char*right)
	{
		if (strcmp(left,right)>0)
			return true;
		return false;
	}
};

template <class T,class Compare>
void BubbleSort(T*arr, int size)
{
	if (arr == NULL)
		return;
	bool IsChange = false;
	for (int i = 0; i < size - 1; i++)
	{
		IsChange = false;
		for (int j = 0; j < size - i - 1; j++)
		{
			if (Compare()(arr[j], arr[j + 1]))    //Compare是一个类型 ;()是函数名 ; (arr[j],arr[j+1])是参数
			{
				IsChange = true;
				swap(arr[j], arr[j + 1]);
			}
		}
		if (IsChange == false)
			return;
	}
}
测试函数
int main()
{

	char arr[] = "acdbfe!";
	BubbleSort<char, Rise<char>>(arr, 7);

	string arr1[] = { "cde", "fbi", "kmj" };
	BubbleSort<string, Less<string>>(arr1, 3);

	int arr2[] = { 3, 2, 4, 1, 5, 7, 6, 8, 0, 9 };
	BubbleSort<int, Rise<int>>(arr2, sizeof(arr2) / sizeof(arr2[0]));

	char*p[] = { "cd", "acd", "bcd" };
	BubbleSort<char*, Less<char*>>(p, 3);

	system("pause");
	return 0;
}

第三种用到了函数模板,类模板,还有特化函数,如果看不懂的话可以查找C++中模板,特化函数的知识点



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值