Use an homegrown insertion sort instead of std::sort()

It is stable and it is also a bit faster then std::sort()
on the tipical small move lists that we need to handle.

Verified to have same functionality of std::stable_sort()

After 999 games at 1+0
Mod vs Orig +240 =534 -225 50.75%  507.0/999  +5 ELO

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba
2009-10-15 13:08:39 +02:00
parent c1ea5ed6f7
commit 4dd7fccfd1
2 changed files with 26 additions and 7 deletions

View File

@@ -62,9 +62,29 @@ struct MoveStack {
int score;
};
// Note that operator< is set up such that std::sort() will sort in descending order
// Note that operator< is set up such that sorting will be in descending order
inline bool operator<(const MoveStack& f, const MoveStack& s) { return s.score < f.score; }
// Our stable insertion sort in range [firstMove, lastMove), platform independent
template<typename T>
inline void sort_moves(T* firstMove, T* lastMove)
{
T value;
T *cur, *p, *d;
if (firstMove != lastMove)
for (cur = firstMove; ++cur != lastMove; )
{
p = d = cur;
value = *p--;
if (value < *p)
{
do *d = *p;
while (--d != firstMove && value < *--p);
*d = value;
}
}
}
////
//// Inline functions