普通版冒泡排序
对于冒泡排序的算法大家并不陌生,将相临两个数一次比较,然后将最大值或者最小值先排出来,一般来说这样的话我们需要在碗面写两个函数来分别实现这两个算法,程序代码如下:
void Bubble(int arr[], size_t size)
{
for (size_t idx = 0; idx < size - 1; idx++)
{
for (size_t jdx = 0; jdx < size - idx - 1; ++jdx)
{
//升序
/*if (arr[jdx] < arr[jdx + 1])
{
std::swap(arr[jdx], arr[jdx + 1]);
}*/
//降序
if (arr[jdx] > arr[jdx + 1])
{
std::swap(arr[jdx], arr[jdx + 1]);
}
}
}
}
int main()
{
int arr[] = { 1, 4, 3, 5, 8, 9, 2, 7, 6 };
Bubble(arr, sizeof(arr) / sizeof(arr[0]));
for (size_t i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i)
{
cout << arr[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
模板+仿函数的方法
实现冒泡排序的通用算法,可以直接在外部指定按照升序或者降序来排,首先我们需在外面分别定义两个类模板,其中的主要工作是重载一下()这种运算符,使它可以用于返回两个操作数之间的大着或者小者,在写通用的冒泡排序时,也给定一个模板函数,让它可以完成冒泡函数的功能,同时也可以针对于不同类型的数组进行冒泡排序,具体的代码实现如下所示:
template<typename T>
class Less
{
public:
bool operator()(T& left, T& right)
{
return left > right;
}
};
template<typename T>
class Great
{
public:
bool operator()(T& left, T& right)
{
return left < right;
}
};
template<typename T, typename Com>
void Bubble(T arr[], size_t size)
{
for (size_t idx = 0; idx < size - 1; idx++)
{
for (size_t jdx = 0; jdx < size - idx - 1; ++jdx)
{
if (Com()(arr[jdx], arr[jdx + 1]))
{
std::swap(arr[jdx], arr[jdx + 1]);
}
}
}
}
下面针对于我们给出的模板函数进行测试
{
int arr[] = { 1, 4, 3, 5, 8, 9, 2, 7, 6 };
cout << "调用升序排序" << endl;
Bubble<int, Less<int>>(arr, sizeof(arr) / sizeof(arr[0]));
for (size_t i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i)
{
cout << arr[i] << " ";
}
cout << endl;
cout << "调用降序排序:" << endl;
Bubble<int, Great<int>>(arr, sizeof(arr) / sizeof(arr[0]));
for (size_t i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i)
{
cout << arr[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
编译运行结果如下