STL学习笔记----14.STL算法之 (排序算法)

 

一. 概述

sort()对所有元素排序
stable_sort()对所有元素排序,并保持相等元素间的相对次序
partial_sort()排序,直到前n个元素就位
partial_sort_copy()排序,直到前n个元素就位,结果复制于它处
nth_element()根据第n个位置进行排序
partition()改变元素次序,使符合某准则的元素在前面
stable_partition()与partition()相同,但保持相对位置
make_heap()将一个区间转换成一个heap
push_heap()将元素加入一个heap
pop_heap()从heap移除一个元素
sort_heap()对heap进行排序,排序后不再是heap了
二. 对所有元素排序

  1. //排序,默认是从小到大顺序 
  2. void 
  3. sort (RandomAccessIterator beg, RandomAccessIterator end) 
  4.  
  5. //排序,使用op(elem1, elem2)准则 
  6. void 
  7. sort (RandomAccessIterator beg, RandomAccessIterator end,
  8.       BinaryPredicate op) 
  9.  
  10. //保证相等元素的原本相对次序在排序后保持不变 
  11. //换句话出,相等的元素它会按照固有的顺序,比如字典顺序排序 
  12. void 
  13. stable_sort (RandomAccessIterator beg, RandomAccessIterator end) 
  14.  
  15. void 
  16. stable_sort (RandomAccessIterator beg, RandomAccessIterator end,
  17.              BinaryPredicate op) 
//排序,默认是从小到大顺序
void
sort (RandomAccessIterator beg, RandomAccessIterator end)

//排序,使用op(elem1, elem2)准则
void
sort (RandomAccessIterator beg, RandomAccessIterator end, 
      BinaryPredicate op)

//保证相等元素的原本相对次序在排序后保持不变
//换句话出,相等的元素它会按照固有的顺序,比如字典顺序排序
void
stable_sort (RandomAccessIterator beg, RandomAccessIterator end)

void
stable_sort (RandomAccessIterator beg, RandomAccessIterator end, 
             BinaryPredicate op)
三. 局部排序
  1. //以 < 对区间[beg, end)内的元素进行排序,使区间[beg, sortEnd)内的元素有序 
  2. void 
  3. partial_sort (RandomAccessIterator beg,  
  4.               RandomAccessIterator sortEnd,  
  5.               RandomAccessIterator end) 
  6.  
  7. //以op(elem1, elem2)对区间内元素进行排序 
  8. void 
  9. partial_sort (RandomAccessIterator beg,  
  10.               RandomAccessIterator sortEnd,  
  11.               RandomAccessIterator end,  
  12.               BinaryPredicate op) 
//以 < 对区间[beg, end)内的元素进行排序,使区间[beg, sortEnd)内的元素有序
void
partial_sort (RandomAccessIterator beg, 
              RandomAccessIterator sortEnd, 
              RandomAccessIterator end)

//以op(elem1, elem2)对区间内元素进行排序
void
partial_sort (RandomAccessIterator beg, 
              RandomAccessIterator sortEnd, 
              RandomAccessIterator end, 
              BinaryPredicate op)
四. 根据第n个元素排序
  1. //对区间[beg, end)内的元素进行排序,使第n个位置上的元素就位 
  2. //也就是n之前的元素都小于等于它,n之后的元素都大于等于它 
  3. //但是n前后的元素不要求有序 
  4. void 
  5. nth_element (RandomAccessIterator beg,  
  6.              RandomAccessIterator nth,  
  7.              RandomAccessIterator end) 
  8.  
  9. void 
  10. nth_element (RandomAccessIterator beg,  
  11.              RandomAccessIterator nth,  
  12.              RandomAccessIterator end,  
  13.              BinaryPredicate op) 
//对区间[beg, end)内的元素进行排序,使第n个位置上的元素就位
//也就是n之前的元素都小于等于它,n之后的元素都大于等于它
//但是n前后的元素不要求有序
void
nth_element (RandomAccessIterator beg, 
             RandomAccessIterator nth, 
             RandomAccessIterator end)

void
nth_element (RandomAccessIterator beg, 
             RandomAccessIterator nth, 
             RandomAccessIterator end, 
             BinaryPredicate op)
五. Heap算法

heap可以看成一个二叉树,具有两大性质:

1. 第一个元素总是最大。

2. 总是能够在对数时间内增加或删除一个元素。


1. 将某区间的元素转化成heap

  1. void 
  2. make_heap (RandomAccesIterator beg, RandomAccesIterator end) 
  3.  
  4. void 
  5. make_heap (RandomAccesIterator beg, RandomAccesIterator end,  
  6.            BinaryPredicate op) 
void
make_heap (RandomAccesIterator beg, RandomAccesIterator end)

void
make_heap (RandomAccesIterator beg, RandomAccesIterator end, 
           BinaryPredicate op)
2. 对heap增加一个元素
  1. //将end之前最后一个元素加入原本就是个heap的[beg, end-1)区间内 
  2. //使整个区间[beg, end)成为一个heap 
  3. void 
  4. push_heap (RandomAccesIterator beg, RandomAccesIterator end) 
  5.  
  6. void 
  7. push_heap (RandomAccesIterator beg, RandomAccesIterator end,  
  8.            BinaryPredicate op) 
//将end之前最后一个元素加入原本就是个heap的[beg, end-1)区间内
//使整个区间[beg, end)成为一个heap
void
push_heap (RandomAccesIterator beg, RandomAccesIterator end)

void
push_heap (RandomAccesIterator beg, RandomAccesIterator end, 
           BinaryPredicate op)
3. 对heap取出下一个元素
  1. //将heap[beg, end)内最高元素,也就是第一个元素,移到最后位置 
  2. //并将剩余区间[beg, end-1)组成一个新的heap 
  3. void 
  4. pop_heap (RandomAccesIterator beg, RandomAccesIterator end) 
  5.  
  6. void 
  7. pop_heap (RandomAccesIterator beg, RandomAccesIterator end,  
  8.           BinaryPredicate op) 
//将heap[beg, end)内最高元素,也就是第一个元素,移到最后位置
//并将剩余区间[beg, end-1)组成一个新的heap
void
pop_heap (RandomAccesIterator beg, RandomAccesIterator end)

void
pop_heap (RandomAccesIterator beg, RandomAccesIterator end, 
          BinaryPredicate op)
4. 将heap转换成一个已序序列
  1. //进入函数前[beg, end)必须是一个heap, 排序后不是一个heap了 
  2. void 
  3. sort_heap (RandomAccesIterator beg, RandomAccesIterator end) 
  4.  
  5. void 
  6. sort_heap (RandomAccesIterator beg, RandomAccesIterator end,  
  7.            BinaryPredicate op) 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值