- C++
从C++算法库里面扒出来的sort宏定义(格式化版)
- 2024-11-9 17:20:20 @
#include<stdio.h>
#include<iterator>
__lg(unsigned long long __n) {
return 8 * __CHAR_BIT__ - 1 - __builtin_clzll(__n);
}
template
<
typename _RandomAccessIterator,
typename _Distance,
typename _Tp,
typename _Compare
>
inline void __push_heap
(
_RandomAccessIterator __first,
_Distance __holeIndex,
_Distance __topIndex,
_Tp __value,
_Compare __comp
)
{
_Distance __parent = (__holeIndex - 1) / 2;
while (__holeIndex > __topIndex && __comp(__first + __parent, __value) == true) {
*(__first + __holeIndex) = _GLIBCXX_MOVE( *(__first + __parent) );
__holeIndex = __parent;
__parent = (__holeIndex - 1) / 2;
}
*(__first + __holeIndex) = _GLIBCXX_MOVE(__value);
return;
}
template
<
typename _RandomAccessIterator,
typename _Distance,
typename _Tp,
typename _Compare
>
inline void __adjust_heap
(
_RandomAccessIterator __first,
_Distance __holeIndex,
_Distance __len,
_Tp __value,
_Compare __comp
)
{
const _Distance __topIndex = __holeIndex;
_Distance __secondChild = __holeIndex;
while (__secondChild < (__len - 1) / 2) {
__secondChild = 2 * (__secondChild + 1);
if (__comp (__first + __secondChild, __first + (__secondChild - 1)) ) {
__secondChild--;
}
*(__first + __holeIndex) = _GLIBCXX_MOVE( *(__first + __secondChild) );
__holeIndex = __secondChild;
}
if ( (__len & 1) == 0 && __secondChild == (__len - 2) / 2 ) {
__secondChild = 2 * (__secondChild + 1);
*(__first + __holeIndex) = _GLIBCXX_MOVE( *(__first + (__secondChild - 1)) );
__holeIndex = __secondChild - 1;
}
__push_heap
(
__first,
__holeIndex,
__topIndex,
_GLIBCXX_MOVE(__value),
__gnu_cxx::__ops::__iter_comp_val(__comp)
);
return;
}
template
<
typename _RandomAccessIterator,
typename _Compare
>
inline void __pop_heap
(
_RandomAccessIterator __first,
_RandomAccessIterator __last,
_RandomAccessIterator __result,
_Compare __comp
)
{
typedef typename std::iterator_traits<_RandomAccessIterator>::value_type
_ValueType;
typedef typename std::iterator_traits<_RandomAccessIterator>::difference_type
_DistanceType;
_ValueType __value = _GLIBCXX_MOVE(*__result);
*__result = _GLIBCXX_MOVE(*__first);
__adjust_heap
(
__first, _DistanceType(0),
_DistanceType(__last - __first),
_GLIBCXX_MOVE(__value), __comp
);
return;
}
template
<
typename _RandomAccessIterator,
typename _Compare
>
inline void __make_heap
(
_RandomAccessIterator __first,
_RandomAccessIterator __last,
_Compare __comp
)
{
typedef typename std::iterator_traits<_RandomAccessIterator>::value_type
_ValueType;
typedef typename std::iterator_traits<_RandomAccessIterator>::difference_type
_DistanceType;
if (__last - __first < 2) {
return;
}
const _DistanceType __len = __last - __first;
_DistanceType __parent = (__len - 2) / 2;
while (true) {
_ValueType __value = _GLIBCXX_MOVE( *(__first + __parent) );
__adjust_heap
(
__first,
__parent,
__len,
_GLIBCXX_MOVE(__value),
__comp
);
if (__parent == 0) {
return;
}
__parent--;
}
return;
}
template
<
typename _RandomAccessIterator,
typename _Compare
>
inline void __heap_select
(
_RandomAccessIterator __first,
_RandomAccessIterator __middle,
_RandomAccessIterator __last,
_Compare __comp
)
{
__make_heap
(
__first,
__middle,
__comp
);
for (_RandomAccessIterator __i = __middle; __i < __last; ++__i) {
if (__comp(__i, __first) == true) {
__pop_heap
(
__first,
__middle,
__i,
__comp
);
}
}
return;
}
template
<
typename _RandomAccessIterator,
typename _Compare
>
inline void __sort_heap
(
_RandomAccessIterator __first,
_RandomAccessIterator __last,
_Compare __comp
)
{
while (__last - __first > 1) {
--__last;
__pop_heap
(
__first,
__last,
__last,
__comp
);
}
return;
}
template
<
typename _Iterator,
typename _Compare
>
inline void __move_median_to_first
(
_Iterator __result,
_Iterator __a,
_Iterator __b,
_Iterator __c,
_Compare __comp
)
{
if (__comp(__a, __b) == true) {
if (__comp(__b, __c) == true) {
std::iter_swap(__result, __b);
}
else if (__comp(__a, __c) == true) {
std::iter_swap(__result, __c);
}
else{
std::iter_swap(__result, __a);
}
}
else if (__comp(__a, __c) == true) {
std::iter_swap(__result, __a);
}
else if (__comp(__b, __c)) {
std::iter_swap(__result, __c);
}
else{
std::iter_swap(__result, __b);
}
return;
}
template
<
typename _RandomAccessIterator,
typename _Compare
>
inline _RandomAccessIterator __unguarded_partition
(
_RandomAccessIterator __first,
_RandomAccessIterator __last,
_RandomAccessIterator __pivot,
_Compare __comp
)
{
while (true) {
while (__comp(__first, __pivot) == true) {
++__first;
}
--__last;
while (__comp(__pivot, __last) == true) {
--__last;
}
if (__first < __last == false) {
return __first;
}
std::iter_swap
(
__first,
__last
);
++__first;
}
}
template
<
typename _RandomAccessIterator,
typename _Compare
>
inline _RandomAccessIterator __unguarded_partition_pivot
(
_RandomAccessIterator __first,
_RandomAccessIterator __last,
_Compare __comp
)
{
_RandomAccessIterator __mid = __first + (__last - __first) / 2;
__move_median_to_first
(
__first,
__first + 1,
__mid,
__last - 1,
__comp
);
return __unguarded_partition
(
__first + 1,
__last,
__first,
__comp
);
}
template
<
typename _RandomAccessIterator,
typename _Compare
>
inline void __partial_sort
(
_RandomAccessIterator __first,
_RandomAccessIterator __middle,
_RandomAccessIterator __last,
_Compare __comp
)
{
__heap_select
(
__first,
__middle,
__last,
__comp
);
__sort_heap
(
__first,
__middle,
__comp
);
return;
}
template
<
typename _RandomAccessIterator,
typename _Compare
>
inline void __unguarded_linear_insert
(
_RandomAccessIterator __last,
_Compare __comp
)
{
typename std::iterator_traits<_RandomAccessIterator>::value_type
__val = _GLIBCXX_MOVE(*__last);
_RandomAccessIterator __next = __last;
--__next;
while (__comp(__val, __next) == true) {
*__last = _GLIBCXX_MOVE(*__next);
__last = __next;
--__next;
}
*__last = _GLIBCXX_MOVE(__val);
return;
}
template
<
typename _RandomAccessIterator,
typename _Compare
>
inline void __insertion_sort
(
_RandomAccessIterator __first,
_RandomAccessIterator __last,
_Compare __comp
)
{
if (__first == __last) {
return;
}
for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i) {
if (__comp(__i, __first) == true) {
typename std::iterator_traits<_RandomAccessIterator>::value_type
__val = _GLIBCXX_MOVE(*__i);
_GLIBCXX_MOVE_BACKWARD3
(
__first,
__i,
__i + 1
);
*__first = _GLIBCXX_MOVE(__val);
}
else{
__unguarded_linear_insert
(
__i,
__gnu_cxx::__ops::__val_comp_iter(__comp)
);
}
}
return;
}
template
<
typename _RandomAccessIterator,
typename _Compare
>
inline void __unguarded_insertion_sort
(
_RandomAccessIterator __first,
_RandomAccessIterator __last,
_Compare __comp
)
{
for (_RandomAccessIterator __i = __first; __i != __last; ++__i) {
__unguarded_linear_insert
(
__i,
__gnu_cxx::__ops::__val_comp_iter(__comp)
);
}
return;
}
template
<
typename _RandomAccessIterator,
typename _Compare
>
inline void __final_insertion_sort
(
_RandomAccessIterator __first,
_RandomAccessIterator __last,
_Compare __comp
)
{
if (__last - __first > 16) {
__insertion_sort
(
__first,
__first + 16,
__comp
);
__unguarded_insertion_sort
(
__first + 16,
__last,
__comp
);
}
else {
__insertion_sort
(
__first,
__last,
__comp
);
}
return;
}
template
<
typename _RandomAccessIterator,
typename _Size,
typename _Compare
>
inline void __introsort_loop
(
_RandomAccessIterator __first,
_RandomAccessIterator __last,
_Size __depth_limit,
_Compare __comp
)
{
while (__last - __first > 16) {
if (__depth_limit == 0) {
__partial_sort
(
__first,
__last,
__last,
__comp
);
return;
}
--__depth_limit;
_RandomAccessIterator __cut =
__unguarded_partition_pivot
(
__first,
__last,
__comp
);
__introsort_loop
(
__cut,
__last,
__depth_limit,
__comp
);
__last = __cut;
}
return;
}
template
<
typename _RandomAccessIterator,
typename _Compare
>
inline void __sort
(
_RandomAccessIterator __first,
_RandomAccessIterator __last,
_Compare __comp
)
{
if (__first != __last) {
__introsort_loop
(
__first, __last,
__lg(__last - __first) * 2,
__comp
);
__final_insertion_sort(__first, __last, __comp);
}
return;
}
template<typename _RandomAccessIterator>
inline void sort
(
_RandomAccessIterator __first,
_RandomAccessIterator __last
)
{
__glibcxx_function_requires
(_Mutable_RandomAccessIteratorConcept<_RandomAccessIterator>)
__glibcxx_function_requires
(
_LessThanComparableConcept
<typename iterator_traits<_RandomAccessIterator>::value_type>
)
__glibcxx_requires_valid_range(__first, __last);
__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
return;
}
template
<
typename _RandomAccessIterator,
typename _Compare
>
inline void sort
(
_RandomAccessIterator __first,
_RandomAccessIterator __last,
_Compare __comp
)
{
__glibcxx_function_requires
(_Mutable_RandomAccessIteratorConcept<_RandomAccessIterator>)
__glibcxx_function_requires
(
_BinaryPredicateConcept
<
_Compare,
typename iterator_traits<_RandomAccessIterator>::value_type,
typename iterator_traits<_RandomAccessIterator>::value_type
>
)
__glibcxx_requires_valid_range(__first, __last);
__sort(__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp));
return;
}
3 comments
-
陈锦润 LV 8 @ 2024-11-13 12:35:01
好像兼容性很差 有时候能用有时候不能用 难受
-
2024-11-9 17:31:40@
测试时间程序(按刻计算)
#include<stdio.h> #include<iterator> #include<ctime> __lg(unsigned long long __n) { return 8 * __CHAR_BIT__ - 1 - __builtin_clzll(__n); } template < typename _RandomAccessIterator, typename _Distance, typename _Tp, typename _Compare > inline void __push_heap ( _RandomAccessIterator __first, _Distance __holeIndex, _Distance __topIndex, _Tp __value, _Compare __comp ) { _Distance __parent = (__holeIndex - 1) / 2; while (__holeIndex > __topIndex && __comp(__first + __parent, __value) == true) { *(__first + __holeIndex) = _GLIBCXX_MOVE( *(__first + __parent) ); __holeIndex = __parent; __parent = (__holeIndex - 1) / 2; } *(__first + __holeIndex) = _GLIBCXX_MOVE(__value); return; } template < typename _RandomAccessIterator, typename _Distance, typename _Tp, typename _Compare > inline void __adjust_heap ( _RandomAccessIterator __first, _Distance __holeIndex, _Distance __len, _Tp __value, _Compare __comp ) { const _Distance __topIndex = __holeIndex; _Distance __secondChild = __holeIndex; while (__secondChild < (__len - 1) / 2) { __secondChild = 2 * (__secondChild + 1); if (__comp (__first + __secondChild, __first + (__secondChild - 1)) ) { __secondChild--; } *(__first + __holeIndex) = _GLIBCXX_MOVE( *(__first + __secondChild) ); __holeIndex = __secondChild; } if ( (__len & 1) == 0 && __secondChild == (__len - 2) / 2 ) { __secondChild = 2 * (__secondChild + 1); *(__first + __holeIndex) = _GLIBCXX_MOVE( *(__first + (__secondChild - 1)) ); __holeIndex = __secondChild - 1; } __push_heap ( __first, __holeIndex, __topIndex, _GLIBCXX_MOVE(__value), __gnu_cxx::__ops::__iter_comp_val(__comp) ); return; } template < typename _RandomAccessIterator, typename _Compare > inline void __pop_heap ( _RandomAccessIterator __first, _RandomAccessIterator __last, _RandomAccessIterator __result, _Compare __comp ) { typedef typename std::iterator_traits<_RandomAccessIterator>::value_type _ValueType; typedef typename std::iterator_traits<_RandomAccessIterator>::difference_type _DistanceType; _ValueType __value = _GLIBCXX_MOVE(*__result); *__result = _GLIBCXX_MOVE(*__first); __adjust_heap ( __first, _DistanceType(0), _DistanceType(__last - __first), _GLIBCXX_MOVE(__value), __comp ); return; } template < typename _RandomAccessIterator, typename _Compare > inline void __make_heap ( _RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp ) { typedef typename std::iterator_traits<_RandomAccessIterator>::value_type _ValueType; typedef typename std::iterator_traits<_RandomAccessIterator>::difference_type _DistanceType; if (__last - __first < 2) { return; } const _DistanceType __len = __last - __first; _DistanceType __parent = (__len - 2) / 2; while (true) { _ValueType __value = _GLIBCXX_MOVE( *(__first + __parent) ); __adjust_heap ( __first, __parent, __len, _GLIBCXX_MOVE(__value), __comp ); if (__parent == 0) { return; } __parent--; } return; } template < typename _RandomAccessIterator, typename _Compare > inline void __heap_select ( _RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last, _Compare __comp ) { __make_heap ( __first, __middle, __comp ); for (_RandomAccessIterator __i = __middle; __i < __last; ++__i) { if (__comp(__i, __first) == true) { __pop_heap ( __first, __middle, __i, __comp ); } } return; } template < typename _RandomAccessIterator, typename _Compare > inline void __sort_heap ( _RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp ) { while (__last - __first > 1) { --__last; __pop_heap ( __first, __last, __last, __comp ); } return; } template < typename _Iterator, typename _Compare > inline void __move_median_to_first ( _Iterator __result, _Iterator __a, _Iterator __b, _Iterator __c, _Compare __comp ) { if (__comp(__a, __b) == true) { if (__comp(__b, __c) == true) { std::iter_swap(__result, __b); } else if (__comp(__a, __c) == true) { std::iter_swap(__result, __c); } else{ std::iter_swap(__result, __a); } } else if (__comp(__a, __c) == true) { std::iter_swap(__result, __a); } else if (__comp(__b, __c)) { std::iter_swap(__result, __c); } else{ std::iter_swap(__result, __b); } return; } template < typename _RandomAccessIterator, typename _Compare > inline _RandomAccessIterator __unguarded_partition ( _RandomAccessIterator __first, _RandomAccessIterator __last, _RandomAccessIterator __pivot, _Compare __comp ) { while (true) { while (__comp(__first, __pivot) == true) { ++__first; } --__last; while (__comp(__pivot, __last) == true) { --__last; } if (__first < __last == false) { return __first; } std::iter_swap ( __first, __last ); ++__first; } } template < typename _RandomAccessIterator, typename _Compare > inline _RandomAccessIterator __unguarded_partition_pivot ( _RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp ) { _RandomAccessIterator __mid = __first + (__last - __first) / 2; __move_median_to_first ( __first, __first + 1, __mid, __last - 1, __comp ); return __unguarded_partition ( __first + 1, __last, __first, __comp ); } template < typename _RandomAccessIterator, typename _Compare > inline void __partial_sort ( _RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last, _Compare __comp ) { __heap_select ( __first, __middle, __last, __comp ); __sort_heap ( __first, __middle, __comp ); return; } template < typename _RandomAccessIterator, typename _Compare > inline void __unguarded_linear_insert ( _RandomAccessIterator __last, _Compare __comp ) { typename std::iterator_traits<_RandomAccessIterator>::value_type __val = _GLIBCXX_MOVE(*__last); _RandomAccessIterator __next = __last; --__next; while (__comp(__val, __next) == true) { *__last = _GLIBCXX_MOVE(*__next); __last = __next; --__next; } *__last = _GLIBCXX_MOVE(__val); return; } template < typename _RandomAccessIterator, typename _Compare > inline void __insertion_sort ( _RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp ) { if (__first == __last) { return; } for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i) { if (__comp(__i, __first) == true) { typename std::iterator_traits<_RandomAccessIterator>::value_type __val = _GLIBCXX_MOVE(*__i); _GLIBCXX_MOVE_BACKWARD3 ( __first, __i, __i + 1 ); *__first = _GLIBCXX_MOVE(__val); } else{ __unguarded_linear_insert ( __i, __gnu_cxx::__ops::__val_comp_iter(__comp) ); } } return; } template < typename _RandomAccessIterator, typename _Compare > inline void __unguarded_insertion_sort ( _RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp ) { for (_RandomAccessIterator __i = __first; __i != __last; ++__i) { __unguarded_linear_insert ( __i, __gnu_cxx::__ops::__val_comp_iter(__comp) ); } return; } template < typename _RandomAccessIterator, typename _Compare > inline void __final_insertion_sort ( _RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp ) { if (__last - __first > 16) { __insertion_sort ( __first, __first + 16, __comp ); __unguarded_insertion_sort ( __first + 16, __last, __comp ); } else { __insertion_sort ( __first, __last, __comp ); } return; } template < typename _RandomAccessIterator, typename _Size, typename _Compare > inline void __introsort_loop ( _RandomAccessIterator __first, _RandomAccessIterator __last, _Size __depth_limit, _Compare __comp ) { while (__last - __first > 16) { if (__depth_limit == 0) { __partial_sort ( __first, __last, __last, __comp ); return; } --__depth_limit; _RandomAccessIterator __cut = __unguarded_partition_pivot ( __first, __last, __comp ); __introsort_loop ( __cut, __last, __depth_limit, __comp ); __last = __cut; } return; } template < typename _RandomAccessIterator, typename _Compare > inline void __sort ( _RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp ) { if (__first != __last) { __introsort_loop ( __first, __last, __lg(__last - __first) * 2, __comp ); __final_insertion_sort(__first, __last, __comp); } return; } template<typename _RandomAccessIterator> inline void sort ( _RandomAccessIterator __first, _RandomAccessIterator __last ) { __glibcxx_function_requires (_Mutable_RandomAccessIteratorConcept<_RandomAccessIterator>) __glibcxx_function_requires ( _LessThanComparableConcept <typename iterator_traits<_RandomAccessIterator>::value_type> ) __glibcxx_requires_valid_range(__first, __last); __sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter()); return; } template < typename _RandomAccessIterator, typename _Compare > inline void sort ( _RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp ) { __glibcxx_function_requires (_Mutable_RandomAccessIteratorConcept<_RandomAccessIterator>) __glibcxx_function_requires ( _BinaryPredicateConcept < _Compare, typename iterator_traits<_RandomAccessIterator>::value_type, typename iterator_traits<_RandomAccessIterator>::value_type > ) __glibcxx_requires_valid_range(__first, __last); __sort(__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp)); return; } int a[100000000],cnt = 0; unsigned long long Begin,End; int main() { for(int i = 1,j = 100000000; i <= j; ++i,--j) { a[cnt++] = i; a[cnt++] = j; } Begin = clock(); sort(a, a + 100000000); End = clock(); printf("%llu",End - Begin); return 0; }
-
2024-11-9 17:22:42@
难怪我写的排序没有算法库里的快 10000多个字谁干得过
- 1