C++模板元编程----快速排序
2020-12-20 15:28
435 查看
目录
简介
上一篇使用C++模板模板实现了一个选择排序。这一次,更进一步的,实现了一个快速排序算法。关于快速排序的可以看这一篇文章快速排序
实现
和上一次一样,我把快速排序算法分为几个小的步骤,分别实现,然后联合在一起,实现算法。
数据结构定义
和之前类似,不过多定义了一个
head_type,同时对一些类型进行了改名。
// 数据结构定义 template<int ...> struct mvector; template<int ...data, int _head> struct mvector<_head, data...> { constexpr static int head = _head; typedef mvector<_head> head_type; typedef mvector<data...> tail_type; constexpr static std::array<int, 1 + sizeof...(data)> value = {_head, data...}; }; template<int _head> struct mvector<_head> { constexpr static int head = _head; typedef mvector<_head> head_type; typedef mvector<> tail_type; constexpr static std::array<int, 1> value = {_head}; }; template<> struct mvector<> { constexpr static int head = -1; typedef mvector<> head_type; typedef mvector<> tail_type; constexpr static std::array<int, 0> value = {}; };
在数组前添加一个元素
// 在数组前增加一个元素 template<int data, typename list> struct add_to_list; template<int data, int ...data_list> struct add_to_list<data, mvector<data_list...>> { typedef mvector<data, data_list...> result_type; };
判断
// 判断,输出一个类型 template<bool, typename T, typename S> struct m_type_if; template<typename T, typename S> struct m_type_if<true, T, S> { typedef T result_type; typedef S not_result_type; }; template<typename T, typename S> struct m_type_if<false, T, S> { typedef S result_type; typedef T not_result_type; };
分堆
56c根据第一个元素,将不同的元素分在不同的数组中
// 分堆 template<typename , typename> struct m_diff; template<typename _mid, int ...data, int data_head> struct m_diff<_mid, mvector<data_head, data...>> { typedef _mid mid; typedef m_diff<_mid, mvector<data...>> next_type; typedef typename m_type_if<data_head < mid::head, typename add_to_list<data_head, typename next_type::right_type>::result_type, typename next_type::right_type>::result_type right_type; typedef typename m_type_if<data_head >= mid::head, typename add_to_list<data_head, typename next_type::left_type>::result_type, typename next_type::left_type>::result_type left_type; }; template<typename _mid> struct m_diff<_mid, mvector<>> { typedef _mid mid; typedef m_diff<_mid, mvector<>> next_type; typedef mvector<> right_type; typedef mvector<> left_type; };
合并
// 合并 template<typename, typename, typename> struct combine_result; template<int ...data_S, int mid, int ...data_T> struct combine_result<mvector<data_S...>, mvector<mid>, mvector<data_T...>> { typedef mvector<data_S..., mid, data_T...> 103c result_type; };
快速排序的实现
// 快排 template<typename data> struct QuickSortWork; template<int ...data> struct QuickSortWork<mvector<data...>> { typedef m_diff<typename mvector<data...>::head_type, typename mvector<data...>::tail_type> diffed_type; typedef typename QuickSortWork<typename diffed_type::right_type>::result_type right_type; typedef typename QuickSortWork<typename diffed_type::left_type>::result_type left_type; typedef typename combine_result<right_type, typename mvector<data...>::head_type, left_type>::result_type result_type; }; template<> struct QuickSortWork<mvector<>> { typedef mvector<> result_type; }; template<int ...data> struct QuickSort { typedef QuickSortWork<mvector<data...>> work_type; constexpr static std::array<int, sizeof...(data)> result = work_type::result_type::value; };
总结
源代码:https://gist.github.com/ink19/2dd0c466db4a11611a9b75e78dd25b4e
和之前的感觉类似,不过使用更加顺手了。
博客原文:博客原文:https://www.cnblogs.com/ink19/p/cpp_template_quick_sort.html
相关文章推荐
- JAVA实现选 4000 择排序、冒泡排序、插入排序、归并排序、希尔排序、堆排序和快速排序
- 九大排序算法及其实现- 插入.冒泡.选择.归并.快速.堆排序.计数.基数.桶排序.堆排序
- 值类型、引用类型、连接池、递归、快速排序
- 快速排序
- 【刷题】快速排序之递归java实现
- 蓝桥杯 快速排序
- 数据结构自用笔记(七):快速排序
- C# 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序
- 链表之排序(插入、选择、归并、快速、冒泡)
- 冒泡排序,快速排序,插入排序的C++实现
- 快速排序
- 快速排序
- 快速排序实例
- python实现选择排序、插入排序、希尔排序、快速排序、归并排序
- java如何实现快速排序
- 快速排序
- 68.qq号索引结构体写入内存,并实现快速排序
- java快速排序
- 快速排序
- 23 快速排序2