STL经典算法我实现
囊括所有STL经典的算法,完全不涉及C++高级特性的自我实现。剖析STL的内在魅力,将经典算法扩展到C中去。
cyningsun
这个作者很懒,什么都没留下…
展开
-
STL经典算法集锦<八>之IntroSort
STL的sort算法的优化策略:1、 数据量大时采用QuickSort,分段递归排序。2、 一旦分段后的数据量小于某个门槛,为避免Quick Sort的递归调用带来的额外负荷,就改用Insertion Sort。3、 如果层次过深,还会改用HeapSort4、 “三点中值”获取好的分割IntroSort的实现代码为://数据量的分界线,决定了使用quick so原创 2012-05-08 20:21:47 · 5359 阅读 · 1 评论 -
STL经典算法集锦<七>之随机洗牌(random_shuffle)
将一个数组中的元素序列打算顺序进行重排,并需要保证重排后的每一种结果是等概率且随机的。下面的两种算法哪一种是正确的?(注:random(a,b)返回一个a~b的随机整数)1. for i=1 to n do swap( a[i], a[random(1,n)] );2. for i=1 to n do swap( a[i], a[random(i,n)] );解释:首先,1~n原创 2012-05-08 13:31:03 · 9832 阅读 · 5 评论 -
STL经典算法集锦<六>之排列(next_permutation/prev_permutation)
STL中涉及到数组的排列的有两个函数,即next_permutation/prev_permutation,分别用于求上一个以及下一个排列。两函数的算法使用的原理大体相同。以next_permutation为例,列出算法并解释。算法:首先,从最为段开始往前寻找两个相邻的元素,令第一个元素索引为endi第二个元素索引为endii,且满足array[endi]。然后,再从最尾端开始向前检测原创 2012-05-07 15:54:09 · 2403 阅读 · 1 评论 -
STL经典算法集锦<五>之查找(lower_bound/upper_bound/binary_search)
这三个算法都比较的常用,而且具有一定的相似的性。理论依据也很明显,下面就直接贴出自己的实现版本。其中lower_bound与upper_bound实现了两个版本。版本一与STL的实现方法完全相同,以数据的总长度折半,版本二则是直接取前后的中点。当然本质上没有太大区别。lower_bound版本一:int lowerBound(int array[],int left,int right,i原创 2012-04-25 17:01:06 · 2465 阅读 · 0 评论 -
STL经典算法集锦<四>之rotate
STL在rotate上的优化是极尽其所能的。分别对前向访问,双向访问,随机访问的数据结构实现了三个版本的rotate。下面是自己按照对三种算法的理解,自己进行的实现。实现中我尽力避免使用C++的特性,从而以后可以在纯C的代码中使用。下面是我使用到的数据结构,单向链表与双向链表,用于实现算法和验证算法的正确性://单链表节点typedef struct Node* Link;stru原创 2012-04-25 16:47:08 · 2479 阅读 · 0 评论 -
STL经典算法集锦<三>之partition与qsort
STL的分割算法主要使用了仿函数来实现。而此处的分割则不,此处实现了两种形式的分割算法:非随机分割算法、随机分割算法(随机算法是在非随机算法的基础上封装而成)。而快速排序则只需简单依赖分割算法就能实现。非随机分割算法:int partition(int array[],int left,int right){ //选择最右侧的元素作为分割标准 int index = left;原创 2012-03-24 20:15:42 · 2017 阅读 · 0 评论 -
STL经典算法集锦<二>之堆算法
堆算法主要包括建立最大堆和堆排序算法。所使用建堆的数组将以0开始存储数据。下面将以两种方法建堆:自底向上的建堆(STL和算法导论中使用到的)、自顶向下建堆(即插入建堆的方法)公共操作:int parent(int i){ return (int)((i-1)/2);} int left(int i){ return 2 * i+1;} int rig原创 2012-03-24 19:55:27 · 1654 阅读 · 0 评论 -
STL经典算法集锦<一>之list::sort
算法中使用到的数据结构:typedef struct Node* Link;struct Node{ int value; Link next;};算法代码://链表的归并void merge(Link& first,Link& second){ Node newHead; Link temp=&newHead; while(first!=NULL&&second!原创 2012-03-23 15:27:36 · 1532 阅读 · 0 评论 -
STL经典算法集锦
所谓经典算法是指STL中有一定的复杂性并且又经常用到的算法。其他算法多是较为容易,利用STL操作很容易实现就不在此之列了。共计15个算法,包括: 1、list::sort 2、heap 3、partition 4、rotate(链表版,数组版,即random_原创 2012-03-23 10:01:45 · 1490 阅读 · 0 评论