文章目录

  • make_head and sort_head
  • sort
    • bubble_sort
    • heap_sort
    • select_sort
    • insert_sort

make_head and sort_head

#include <iostream>
#include <algorithm>
#include <vector>
#include "log/logx.h"namespace {template<class RandomAccessIterator>void displayData(RandomAccessIterator _begin, RandomAccessIterator _end) {while (_begin != _end) {std::cout << *_begin << " ";_begin++;}std::cout << std::endl;}
}namespace TSTL {template<class RandomAccessIterator, class Compare>static void headAdjuest(RandomAccessIterator first, RandomAccessIterator last,RandomAccessIterator index , Compare comp) {using distance_type = typename std::iterator_traits<RandomAccessIterator>::difference_type;//RandomAccessIterator::difference_type distance_type target_index = index - first;distance_type child_left = target_index * 2 + 1;distance_type child_right = target_index * 2 + 2;distance_type all_len = last-first;if (child_left < all_len && (comp(*(first + target_index), *(first + child_left)))) target_index = child_left;if (child_right < all_len && (comp(*(first + target_index), *(first + child_right)))) target_index = child_right;if ((first + target_index) != index) {std::swap(*(first + target_index), *index);headAdjuest(first, last, first+target_index, comp);}}template <class RandomAccessIterator>void make_heap(RandomAccessIterator first, RandomAccessIterator last) {make_heap(first, last,std::less());}template <class RandomAccessIterator, class Compare>void make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp) {const auto range = last - first;for (auto cur = first + range / 2 - 1; cur >= first; --cur) {headAdjuest(first, last, cur, comp);if (cur == first) return;}}template <class RandomAccessIterator, class Compare>void sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp) {TSTL::make_heap(first, last, comp);using distance_type = typename std::iterator_traits<RandomAccessIterator>::difference_type;distance_type all_len = last - first;for (auto i= all_len - 1; i !=0 ; i--){std::swap(*(first + i),*(first+0));headAdjuest(first, first + i, first,comp);}}}int main(int argc, char** argv) {std::vector<int> vec2{ 1,4,2,1,5678,123,34,53,123,4,5 };LOGXA("make heap");std::vector<int> vec=vec2;LOGXT("old vec");displayData(vec.begin(), vec.end());TSTL::make_heap(vec.begin(), vec.end(), [](int a, int b) {return (a > b); });LOGXT("min head");displayData(vec.begin(), vec.end());vec = vec2;LOGXT("max head");TSTL::make_heap(vec.begin(), vec.end(), [](int a, int b) {return (a < b); });displayData(vec.begin(), vec.end());LOGXA("sort heap");vec = vec2;LOGXT("old vec");displayData(vec.begin(), vec.end());TSTL::sort_heap(vec.begin(), vec.end(), [](int a, int b) {return (a < b); });LOGXT("min sort");displayData(vec.begin(), vec.end());vec = vec2;TSTL::sort_heap(vec.begin(), vec.end(), [](int a, int b) {return (a > b); });LOGXT("max sort");displayData(vec.begin(), vec.end());//TinySTL::make_heap(vec.begin(), vec.end());return 0;
}

sort

bubble_sort

#include <iostream>
#include <algorithm>
#include <vector>
#include "log/logx.h"namespace {template<class RandomAccessIterator>void displayData(RandomAccessIterator _begin, RandomAccessIterator _end) {while (_begin != _end) {std::cout << *_begin << " ";_begin++;}std::cout << std::endl;}}namespace TSTL {template<class RandomIterator, class BinaryPredicate>void bubble_sort(RandomIterator first, RandomIterator last, BinaryPredicate pred) {auto len = last - first;for (auto i = len; i != 0; --i) {bool swaped = false;for (auto p = first; p != (first + i - 1); ++p) {if (pred(*(p + 1), *p)) {std::swap(*(p + 1), *p);swaped = true;}}if (!swaped)break;}}}int main(int argc, char** argv) {std::vector<int> vec2{ 1,4,2,1,5678,123,34,53,123,4,5 };std::vector<int> vec=vec2;LOGXT("old vec");displayData(vec.begin(), vec.end());TSTL::bubble_sort(vec.begin(), vec.end(), std::less());displayData(vec.begin(), vec.end());return 0;
}

heap_sort

template<class RandomAccessIterator, class Compare>static void headAdjuest(RandomAccessIterator first, RandomAccessIterator last,RandomAccessIterator index , Compare comp) {using distance_type = typename RandomAccessIterator::difference_type;//RandomAccessIterator::difference_type distance_type target_index = index - first;distance_type child_left = target_index * 2 + 1;distance_type child_right = target_index * 2 + 2;distance_type all_len = last-first;if (child_left < all_len && (comp(*(first + target_index), *(first + child_left)))) target_index = child_left;if (child_right < all_len && (comp(*(first + target_index), *(first + child_right)))) target_index = child_right;if ((first + target_index) != index) {std::swap(*(first + target_index), *index);headAdjuest(first, last, first+target_index, comp);}}template <class RandomAccessIterator>void make_heap(RandomAccessIterator first, RandomAccessIterator last) {make_heap(first, last,std::less());}template <class RandomAccessIterator, class Compare>void make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp) {const auto range = last - first;for (auto cur = first + range / 2 - 1; cur >= first; --cur) {headAdjuest(first, last, cur, comp);if (cur == first) return;}}template <class RandomAccessIterator, class Compare>void sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp) {TSTL::make_heap(first, last, comp);using distance_type = typename std::iterator_traits<RandomAccessIterator>::difference_type;distance_type all_len = last - first;for (auto i= all_len - 1; i !=0 ; i--){std::swap(*(first + i),*(first+0));headAdjuest(first, first + i, first,comp);}}//===============else========template <class RandomAccessIterator, class Compare>void sort_heap2(RandomAccessIterator first, RandomAccessIterator last, Compare comp) {TSTL::make_heap(first, last, comp);//using distance_type = typename std::iterator_traits<RandomAccessIterator>::difference_type;//distance_type all_len = last - first;auto all_len = last - first;for (auto i = all_len ; i != 1; i--) {pop_heap(first, (first + i), comp);//swap first and (first+i) ,adjust first to heap}}

select_sort

 template <class RandomAccessIterator, class Compare>void sort_select(RandomAccessIterator first, RandomAccessIterator last, Compare comp) {auto all_len = last - first;for (decltype(all_len) i = 0; i <all_len-1; i++) {decltype(all_len) target_index = i;for (decltype(all_len)j = i+1; j < all_len; j++) {if (comp(*(first + j), *(first + target_index)))target_index = j;}if (target_index != i)std::swap(*(first + target_index), *(first + i));}}

insert_sort

 template <class RandomAccessIterator, class Compare>void sort_insert(RandomAccessIterator first, RandomAccessIterator last, Compare comp) {auto all_len = last - first;decltype(all_len) j = 0;for (decltype(all_len) i = 1; i < all_len ; i++) {auto insert_data = *(first+i);j = i - 1;for (; j >= 0 && comp(insert_data ,*(first + j)); j--) {*(first + (j + 1))=*(first+j);}*(first + (j+1) ) = insert_data;}}

STL_template相关推荐

最新文章

  1. php 签名开发,BOS签名算法的PHP demo
  2. histeq函数实现直方图的均衡化和规定化
  3. linux下查找某个文件位置的方法
  4. Java蓝牙电话_Android mediaPlayer和蓝牙汽车/耳机电话
  5. 全球及中国语音拾音耳机行主要产品及营销模式分析报告业2022-2028年版
  6. idea启动前端vue项目(各种坑)
  7. 基于生成对抗网络的医学数据域适应研究
  8. 基于深度神经网络的大规模植物分类
  9. 计算机专业校企合作实施方案,校企合作-校企合作、工学结合机制实施方案
  10. 1.2 安装 docker 容器并配置镜像加速器
  11. OD调试2----破解序列号验证程序
  12. Hadoop fs shell命令汇总
  13. matlab查看剪贴板图片,怎么把图片,txt文档复制到剪贴板中?
  14. 编程中的心流模式flow
  15. vue插槽,内容分发
  16. 处理器后面的字母含义_科普向,笔记本cpu结尾字母的含义
  17. oracle_day5_程序包
  18. Zephyr网络协议
  19. 嵌入式地理信息系统技术
  20. 四川引入 AI 技术守护大熊猫【智能快讯】

热门文章

  1. idea 插件的使用
  2. Unity Animator不受Time.TimeScale影响
  3. html遍历集合如何修改其中一,JavaScript简单快速入门
  4. 编译LAVFilters
  5. 汇总印制电路板设计经验
  6. 停车场管理c语言课程设计,数据结构课程设计-停车场管理
  7. 经验分享:查看手机微博二维码名片方法
  8. 软!为码农而生的静电容键盘——PLUM 87键 全域35g
  9. elementary os 配置单
  10. 使用HTML与CSS制作一个简易的华为商城页面和注册页面