自己用来复习使用的:
- 快速排序的大概的意思就是选出一个值
- 将后面的值分成两个集合分别是大于选出的值,和小于选出的值的两个集合
- 然后在将上面分出来的两个集合重复上面的步骤。
- 最后合并两个集合,中间的连接用选出值连接
- quick_sort.hpp
#pragma once
#include <vector>
namespace base
{
class quick_sort
{
public:
template<class T, template<typename...> typename C_>
void operator()(typename C_<T>& input)
{
if (input.size() <= 1) //迭代退出的条件
return;
auto first_value = *std::begin(input);
C_<T> less_; //小于初值的集合
C_<T> greater_; //大于初值的集合
//进行遍历筛选
for (auto b = std::begin(input) + 1; b != std::end(input); ++b)
{
if (*b >= first_value)
{
greater_.push_back(*b);
}
else
{
less_.push_back(*b);
}
}
operator()(greater_); //将大于初选值的集合再次进行排序
operator()(less_); //将小于初选值的集合再次进行排序
//连接集合
input.clear();
std::copy(less_.begin(), less_.end(), std::back_inserter<C_<T>>(input));
input.push_back(first_value);
std::copy(greater_.begin(), greater_.end(), std::back_inserter<C_<T>>(input));
}
};
}
测试程序:
- main.cpp
#include <vector>
#include "executor.hpp"
#include "basic_alg.h"
#include "quick_sort.hpp"
int main(int argc, char** argv)
{
std::vector<int> value{ 100,232,32,2,4,5,323,123,45 };
base::print_msg("Before sort: ", value);
base::executor<base::quick_sort>::exe(value);
base::print_msg("After sort: ", value);
}
程序运行的结果
运行结果