#ifndef COCKTAIL_SORT_H
#define COCKTAIL_SORT_H
#include<vector>
/// 鸡尾酒排序
/// 要是文艺点的话,可以说是搅拌排序,通俗易懂点的话,就叫“双向冒泡排序”,
template<typename T>
class sort_cocktail
{
public:
static void sort(std::vector<T>& arr)
{
//判断是否已经排序了
auto need_sort = false;
//因为是双向比较,所以比较次数为原来数组的1/2次即可。
for (int i = 1; i <= arr.size() / 2; i++)
{
//从前到后的排序 (升序)
for (int m = i - 1; m <= arr.size() - i; m++)
{
//如果前面大于后面,则进行交换
if (m + 1 < arr.size() && arr[m] > arr[m + 1])
{
auto temp = arr[m];
arr[m] = arr[m + 1];
arr[m + 1] = temp;
need_sort = true;
}
}
//从后到前的排序(降序)
for (int n = arr.size() - i - 1; n >= i; n--)
{
//如果前面大于后面,则进行交换
if (n > 0 && arr[n - 1] > arr[n])
{
auto temp = arr[n];
arr[n] = arr[n - 1];
arr[n - 1] = temp;
need_sort = true;
}
}
//当不再有排序,提前退出
if (!need_sort)
{
break;
}
}
}
};
#endif // COCKTAIL_SORT_H