/* CocktailSort.cpp */ #include "stdafx.h" #include "CocktailSort.h" #include #pragma optimize( "t", on ) static void __stdcall SwapUU(void* p1, void* p2) { char *c1 = ( char* ) p1, *c2 = ( char* ) p2, cdata; size_t sztRecLength = sizeof( SortRecStruct ); __m128i XmmTemp; DWORD dwTemp; while( sztRecLength >= 16 ) { XmmTemp = _mm_loadu_si128( ( __m128i* ) c1 ); _mm_storeu_si128( ( __m128i* ) c1, _mm_loadu_si128( ( __m128i* ) c2 ) ); _mm_storeu_si128( ( __m128i* ) c2, XmmTemp ); c1 += 16; c2 += 16; sztRecLength -= 16; } if( sztRecLength >= 8 ) { XmmTemp = _mm_loadl_epi64( ( __m128i* ) c1 ); _mm_storel_epi64( ( __m128i* ) c1, _mm_loadl_epi64( ( __m128i* ) c2 ) ); _mm_storel_epi64( ( __m128i* ) c2, XmmTemp ); c1 += 8; c2 += 8; sztRecLength -= 8; } if( sztRecLength >= 4 ) { dwTemp = *( ( DWORD* ) c1 ); *( ( int* ) c1 ) = *( ( DWORD* ) c2 ); *( ( DWORD* ) c2 ) = dwTemp; c1 += 4; c2 += 4; sztRecLength -=4; } while( sztRecLength-- ) { cdata = *c1; *c1++ = *c2; *c2++ = cdata; } } static DWORD __stdcall CocktailSortAR(SortRecStruct* pArray, size_t pTop, size_t pBtm, bool* pAbort) { size_t sztFinalSwap, sztPtr; do { for( sztFinalSwap = sztPtr = pTop; sztPtr < pBtm; sztPtr++ ) { if( pArray[ sztPtr + 1 ].Key < pArray[ sztPtr ].Key ) { SwapUU( &pArray[ sztPtr + 1 ], &pArray[ sztPtr ] ); sztFinalSwap = sztPtr; } } pBtm = sztFinalSwap; if( pTop >= pBtm ) break; // for( sztFinalSwap = sztPtr = pBtm; sztPtr > pTop; sztPtr-- ) { if( pArray[ sztPtr - 1 ].Key > pArray[ sztPtr ].Key ) { SwapUU( &pArray[ sztPtr - 1 ], &pArray[ sztPtr ] ); sztFinalSwap = sztPtr; } } pTop = sztFinalSwap; if( *pAbort ) return 1223; } while( pTop < pBtm ); return 0; } DWORD __stdcall CocktailSortA(SortRecStruct* pArray, size_t pRecCount, bool* pAbort) { return CocktailSortAR( pArray, 0, pRecCount - 1, pAbort ); } static DWORD __stdcall CocktailSortBR(SortRecStruct* pTop, SortRecStruct* pBtm, bool* pAbort) { SortRecStruct *RecFinalSwap, *RecPtr; do { for( RecFinalSwap = RecPtr = pTop; RecPtr < pBtm; RecPtr++ ) { if( ( RecPtr + 1 )->Key < RecPtr->Key ) { SwapUU( RecPtr + 1, RecPtr ); RecFinalSwap = RecPtr; } } pBtm = RecFinalSwap; if( pTop >= pBtm ) break; // for( RecFinalSwap = RecPtr = pBtm; RecPtr > pTop; RecPtr-- ) { if( ( RecPtr - 1 )->Key > RecPtr->Key ) { SwapUU( RecPtr - 1, RecPtr ); RecFinalSwap = RecPtr; } } pTop = RecFinalSwap; if( *pAbort ) return 1223; } while( pTop < pBtm ); return 0; } DWORD __stdcall CocktailSortB(SortRecStruct* pArray, size_t pRecCount, bool* pAbort) { return CocktailSortBR( pArray, &pArray[ pRecCount - 1 ], pAbort ); }