STL中的排序算法
1、对所有的元素进行排序
void sort(RandomAccessIterator beg,RandomAccessIterator end); void sort(RandomAccessIterator beg,RandomAccessIterator end,BinaryPredicate op); void stable_sort(RandomAccessIterator beg,RandomAccessIterator end); void stable_sort(RandomAccessIterator beg,RandomAccessIterator end,BinaryPredicate op)
有stable的函数可保证相等元素的原本相对次序在排序后保持不变(这里的相等是自己提供函数所表示的两个元素相等,比不是一模一样的元素)
sort采用的是成熟的"快速排序算法"(目前大部分STL版本已经不是采用简单的快速排序,而是结合内插排序算法),可以保证很好的平均性能、复杂度为n*log(n),由于单纯的快速排序在理论上有最差的情况,性能很低,其算法复杂度为n*n,但目前大部分的STL版本都已经在这方面做了优化,因此你可以放心使用。stable_sort采用的是"归并排序",分派足够内存是,其算法复杂度为n*log(n), 否则其复杂度为n*log(n)*log(n),其优点是会保持相等元素之间的相对位置在排序前后保持一致
2、局部排序
void partial_sort(RandomAccessIterator beg,RandomAccessIterator sortEnd,RandomAccessIterator end); void partial_sort(RandomAccessIterator beg,RandomAccessIterator sortEnd,RandomAccessIterator end,BinaryPredicate op);
采用的堆排序(heapsort),它在任何情况下的复杂度都是n*log(n). 它是对[ben,end)内的元素排序,使区间[ben,sortEnd)内的元素有序;如果你希望用partial_sort来实现全排序,你只要让middle=last就可以了。
3、指定元素的排序
void nth_element(RandomAccessIterator beg,RandomAccessIterator nth,RandomAccesstIterator end); void nth_element(RandomAccessIterator beg,RandomAccessIterator nth,RandomAccesstIterator end,BinaryPredicate op);
对区间[beg end)内的元素排序,使第n个位置的的元素就位,即所有在位置n之前的元素小于它,所有在位置n之后的元素大于它。
4、"分类"算法
ForwardIterator partitial(ForwardIterator beg,ForwardIterator end,UnaryPredicate op); ForwardIterator stable_partitial(ForwardIterator beg,ForwardIterator end,UnaryPredicate op);
partition就是把一个区间中的元素按照某个准则分成两类