49void Abc_SortMerge(
int * p1Beg,
int * p1End,
int * p2Beg,
int * p2End,
int * pOut )
51 int nEntries = (p1End - p1Beg) + (p2End - p2Beg);
53 while ( p1Beg < p1End && p2Beg < p2End )
55 if ( *p1Beg == *p2Beg )
56 *pOut++ = *p1Beg++, *pOut++ = *p2Beg++;
57 else if ( *p1Beg < *p2Beg )
62 while ( p1Beg < p1End )
64 while ( p2Beg < p2End )
66 assert( pOut - pOutBeg == nEntries );
82 int nSize = pInEnd - pInBeg;
88 if ( pInBeg[0] > pInBeg[1] )
90 pInBeg[0] ^= pInBeg[1];
91 pInBeg[1] ^= pInBeg[0];
92 pInBeg[0] ^= pInBeg[1];
97 int temp, i, j, best_i;
98 for ( i = 0; i < nSize-1; i++ )
101 for ( j = i+1; j < nSize; j++ )
102 if ( pInBeg[j] < pInBeg[best_i] )
105 pInBeg[i] = pInBeg[best_i];
106 pInBeg[best_i] = temp;
112 Abc_Sort_rec( pInBeg + nSize/2, pInEnd, pOutBeg + nSize/2 );
113 Abc_SortMerge( pInBeg, pInBeg + nSize/2, pInBeg + nSize/2, pInEnd, pOutBeg );
114 memcpy( pInBeg, pOutBeg,
sizeof(
int) * nSize );
134 pOutput = (
int *)
malloc(
sizeof(
int) * nSize );
151void Abc_SortMergeCost2(
int * p1Beg,
int * p1End,
int * p2Beg,
int * p2End,
int * pOut,
int * pCost )
153 int nEntries = (p1End - p1Beg) + (p2End - p2Beg);
154 int * pOutBeg = pOut;
155 while ( p1Beg < p1End && p2Beg < p2End )
157 if ( pCost[*p1Beg] == pCost[*p2Beg] )
158 *pOut++ = *p1Beg++, *pOut++ = *p2Beg++;
159 else if ( pCost[*p1Beg] < pCost[*p2Beg] )
164 while ( p1Beg < p1End )
166 while ( p2Beg < p2End )
168 assert( pOut - pOutBeg == nEntries );
184 int nSize = pInEnd - pInBeg;
190 if ( pCost[pInBeg[0]] > pCost[pInBeg[1]] )
192 pInBeg[0] ^= pInBeg[1];
193 pInBeg[1] ^= pInBeg[0];
194 pInBeg[0] ^= pInBeg[1];
197 else if ( nSize < 8 )
199 int temp, i, j, best_i;
200 for ( i = 0; i < nSize-1; i++ )
203 for ( j = i+1; j < nSize; j++ )
204 if ( pCost[pInBeg[j]] < pCost[pInBeg[best_i]] )
207 pInBeg[i] = pInBeg[best_i];
208 pInBeg[best_i] = temp;
215 Abc_SortMergeCost2( pInBeg, pInBeg + nSize/2, pInBeg + nSize/2, pInEnd, pOutBeg, pCost );
216 memcpy( pInBeg, pOutBeg,
sizeof(
int) * nSize );
236 pOutput = (
int *)
malloc(
sizeof(
int) * nSize );
255 int nEntries = (p1End - p1Beg) + (p2End - p2Beg);
256 int * pOutBeg = pOut;
257 while ( p1Beg < p1End && p2Beg < p2End )
259 if ( pCost[*p1Beg] == pCost[*p2Beg] )
260 *pOut++ = *p1Beg++, *pOut++ = *p2Beg++;
261 else if ( pCost[*p1Beg] > pCost[*p2Beg] )
266 while ( p1Beg < p1End )
268 while ( p2Beg < p2End )
270 assert( pOut - pOutBeg == nEntries );
286 int nSize = pInEnd - pInBeg;
292 if ( pCost[pInBeg[0]] < pCost[pInBeg[1]] )
294 pInBeg[0] ^= pInBeg[1];
295 pInBeg[1] ^= pInBeg[0];
296 pInBeg[0] ^= pInBeg[1];
299 else if ( nSize < 8 )
301 int temp, i, j, best_i;
302 for ( i = 0; i < nSize-1; i++ )
305 for ( j = i+1; j < nSize; j++ )
306 if ( pCost[pInBeg[j]] > pCost[pInBeg[best_i]] )
309 pInBeg[i] = pInBeg[best_i];
310 pInBeg[best_i] = temp;
318 memcpy( pInBeg, pOutBeg,
sizeof(
int) * nSize );
338 pOutput = (
int *)
malloc(
sizeof(
int) * nSize );
358 int nEntries = (p1End - p1Beg) + (p2End - p2Beg);
359 int * pOutBeg = pOut;
360 while ( p1Beg < p1End && p2Beg < p2End )
362 if ( p1Beg[1] == p2Beg[1] )
363 *pOut++ = *p1Beg++, *pOut++ = *p1Beg++, *pOut++ = *p2Beg++, *pOut++ = *p2Beg++;
364 else if ( p1Beg[1] < p2Beg[1] )
365 *pOut++ = *p1Beg++, *pOut++ = *p1Beg++;
367 *pOut++ = *p2Beg++, *pOut++ = *p2Beg++;
369 while ( p1Beg < p1End )
370 *pOut++ = *p1Beg++, *pOut++ = *p1Beg++;
371 while ( p2Beg < p2End )
372 *pOut++ = *p2Beg++, *pOut++ = *p2Beg++;
373 assert( pOut - pOutBeg == nEntries );
389 int nSize = (pInEnd - pInBeg)/2;
395 if ( pInBeg[1] > pInBeg[3] )
397 pInBeg[1] ^= pInBeg[3];
398 pInBeg[3] ^= pInBeg[1];
399 pInBeg[1] ^= pInBeg[3];
400 pInBeg[0] ^= pInBeg[2];
401 pInBeg[2] ^= pInBeg[0];
402 pInBeg[0] ^= pInBeg[2];
405 else if ( nSize < 8 )
407 int temp, i, j, best_i;
408 for ( i = 0; i < nSize-1; i++ )
411 for ( j = i+1; j < nSize; j++ )
412 if ( pInBeg[2*j+1] < pInBeg[2*best_i+1] )
415 pInBeg[2*i] = pInBeg[2*best_i];
416 pInBeg[2*best_i] = temp;
417 temp = pInBeg[2*i+1];
418 pInBeg[2*i+1] = pInBeg[2*best_i+1];
419 pInBeg[2*best_i+1] = temp;
427 memcpy( pInBeg, pOutBeg,
sizeof(
int) * 2 * nSize );
444 int i, * pResult, * pInput, * pOutput;
445 pResult = (
int *)
calloc(
sizeof(
int), nSize );
448 pInput = (
int *)
malloc(
sizeof(
int) * 2 * nSize );
449 pOutput = (
int *)
malloc(
sizeof(
int) * 2 * nSize );
450 for ( i = 0; i < nSize; i++ )
451 pInput[2*i] = i, pInput[2*i+1] = pCosts[i];
453 for ( i = 0; i < nSize; i++ )
454 pResult[i] = pInput[2*i];
478 int nEntries = (p1End - p1Beg) + (p2End - p2Beg);
479 int * pOutBeg = pOut;
480 while ( p1Beg < p1End && p2Beg < p2End )
482 if ( pCost[*p1Beg] == pCost[*p2Beg] )
483 *pOut++ = *p1Beg++, *pOut++ = *p2Beg++;
484 else if ( pCost[*p1Beg] < pCost[*p2Beg] )
489 while ( p1Beg < p1End )
491 while ( p2Beg < p2End )
493 assert( pOut - pOutBeg == nEntries );
509 int nSize = pInEnd - pInBeg;
515 if ( pCost[pInBeg[0]] > pCost[pInBeg[1]] )
517 pInBeg[0] ^= pInBeg[1];
518 pInBeg[1] ^= pInBeg[0];
519 pInBeg[0] ^= pInBeg[1];
522 else if ( nSize < 8 )
524 int temp, i, j, best_i;
525 for ( i = 0; i < nSize-1; i++ )
528 for ( j = i+1; j < nSize; j++ )
529 if ( pCost[pInBeg[j]] < pCost[pInBeg[best_i]] )
532 pInBeg[i] = pInBeg[best_i];
533 pInBeg[best_i] = temp;
541 memcpy( pInBeg, pOutBeg,
sizeof(
int) * nSize );
558 int i, * pInput, * pOutput;
559 pInput = (
int *)
malloc(
sizeof(
int) * nSize );
560 for ( i = 0; i < nSize; i++ )
564 pOutput = (
int *)
malloc(
sizeof(
int) * nSize );
588 return *pNum1 - *pNum2;
605 int i, nSize = 50000000;
606 int * pArray = (
int *)
malloc(
sizeof(
int) * nSize );
611 for ( i = 0; i < nSize; i++ )
622 Abc_PrintTime( 1,
"New sort", Abc_Clock() - clk );
624 for ( i = 1; i < nSize; i++ )
625 assert( pArray[pPerm[i-1]] <= pArray[pPerm[i]] );
632 Abc_PrintTime( 1,
"New sort", Abc_Clock() - clk );
634 for ( i = 1; i < nSize; i++ )
635 assert( pArray[i-1] <= pArray[i] );
641 qsort( (
void *)pArray, (
size_t)nSize,
sizeof(
int), (
int (*)(
const void *,
const void *))
Abc_SortNumCompare );
642 Abc_PrintTime( 1,
"Old sort", Abc_Clock() - clk );
644 for ( i = 1; i < nSize; i++ )
645 assert( pArray[i-1] <= pArray[i] );
667 if ( (
unsigned)(*p1) < (
unsigned)(*p2) )
669 if ( (
unsigned)(*p1) > (
unsigned)(*p2) )
675 if ( (
unsigned)(*p1) > (
unsigned)(*p2) )
677 if ( (
unsigned)(*p1) < (
unsigned)(*p2) )
688 for ( i = 1; i < nSize; i++ )
689 assert( (
unsigned)pData[i-1] >= (
unsigned)pData[i] );
695 for ( i = 1; i < nSize; i++ )
696 assert( (
unsigned)pData[i-1] <= (
unsigned)pData[i] );
717static inline void Abc_SelectSortInc(
word * pData,
int nSize )
720 for ( i = 0; i < nSize-1; i++ )
723 for ( j = i+1; j < nSize; j++ )
724 if ( (
unsigned)pData[j] < (
unsigned)pData[best_i] )
729static inline void Abc_SelectSortDec(
word * pData,
int nSize )
732 for ( i = 0; i < nSize-1; i++ )
735 for ( j = i+1; j < nSize; j++ )
736 if ( (
unsigned)pData[j] > (
unsigned)pData[best_i] )
751 Abc_SelectSortInc( pData + l, r - l + 1 );
756 while ( (
unsigned)pData[++i] < (
unsigned)v );
757 while ( (
unsigned)v < (
unsigned)pData[--j] )
777 Abc_SelectSortDec( pData + l, r - l + 1 );
782 while ( (
unsigned)pData[++i] > (
unsigned)v );
783 while ( (
unsigned)v > (
unsigned)pData[--j] )
798 int k, i = l-1, j = r,
p = l-1, q = r;
804 Abc_SelectSortInc( pData + l, r - l + 1 );
809 while ( (
unsigned)pData[++i] < (
unsigned)v );
810 while ( (
unsigned)v < (
unsigned)pData[--j] )
816 if ( (
unsigned)pData[i] == (
unsigned)v )
818 if ( (
unsigned)v == (
unsigned)pData[j] )
823 for ( k = l; k <
p; k++, j-- )
825 for ( k = r-1; k > q; k--, i++ )
833 int k, i = l-1, j = r,
p = l-1, q = r;
839 Abc_SelectSortDec( pData + l, r - l + 1 );
844 while ( (
unsigned)pData[++i] > (
unsigned)v );
845 while ( (
unsigned)v > (
unsigned)pData[--j] )
851 if ( (
unsigned)pData[i] == (
unsigned)v )
853 if ( (
unsigned)v == (
unsigned)pData[j] )
858 for ( k = l; k <
p; k++, j-- )
860 for ( k = r-1; k > q; k--, i++ )
873 for ( i = 1; i < nSize; i++ )
874 assert( (
unsigned)pData[i-1] >= (
unsigned)pData[i] );
880 for ( i = 1; i < nSize; i++ )
881 assert( (
unsigned)pData[i-1] <= (
unsigned)pData[i] );
891 for ( i = 1; i < nSize; i++ )
892 assert( (
unsigned)pData[i-1] >= (
unsigned)pData[i] );
898 for ( i = 1; i < nSize; i++ )
899 assert( (
unsigned)pData[i-1] <= (
unsigned)pData[i] );
917 for ( i = 0; i < nSize; i++ )
918 pData[i] = ((
word)i << 32) | pCosts[i];
920 for ( i = 0; i < nSize; i++ )
921 pResult[i] = (
int)(pData[i] >> 32);
950 word * pData1, * pData2;
957 for ( i = 0; i < nSize; i++ )
958 pData2[i] = pData1[i] = ((
word)i << 32) | rand();
959 Abc_PrintTime( 1,
"Prepare ", Abc_Clock() - clk );
963 Abc_PrintTime( 1,
"Sort new", Abc_Clock() - clk );
967 for ( i = 0; i < nSize; i++ )
968 printf(
"(%d,%d) ", (
int)(pData1[i] >> 32), (
int)pData1[i] );
974 Abc_PrintTime( 1,
"Sort old", Abc_Clock() - clk );
978 for ( i = 0; i < nSize; i++ )
979 printf(
"(%d,%d) ", (
int)(pData2[i] >> 32), (
int)pData2[i] );
1001#define NUMBER1 3716960521u
1002#define NUMBER2 2174103536u
1007 static unsigned int m_z =
NUMBER1;
1008 static unsigned int m_w =
NUMBER2;
1010 static __thread
unsigned int m_z =
NUMBER1;
1011 static __thread
unsigned int m_w =
NUMBER2;
1018 m_z = 36969 * (m_z & 65535) + (m_z >> 16);
1019 m_w = 18000 * (m_w & 65535) + (m_w >> 16);
1020 return (m_z << 16) + m_w;
#define ABC_SWAP(Type, a, b)
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
unsigned __int64 word
DECLARATIONS ///.
word Abc_RandomW(int fReset)
void Abc_QuickSortCostData(int *pCosts, int nSize, int fDecrease, word *pData, int *pResult)
void Abc_MergeSortCost_rec(int *pInBeg, int *pInEnd, int *pOutBeg)
void Abc_SortCost2_rec(int *pInBeg, int *pInEnd, int *pOutBeg, int *pCost)
void Abc_Sort_rec(int *pInBeg, int *pInEnd, int *pOutBeg)
void Abc_SortMergeCost2(int *p1Beg, int *p1End, int *p2Beg, int *p2End, int *pOut, int *pCost)
void Abc_MergeSort(int *pInput, int nSize)
void Abc_MergeSortCostMerge(int *p1Beg, int *p1End, int *p2Beg, int *p2End, int *pOut)
ABC_NAMESPACE_IMPL_START void Abc_SortMerge(int *p1Beg, int *p1End, int *p2Beg, int *p2End, int *pOut)
DECLARATIONS ///.
void Abc_MergeSortCost2(int *pInput, int nSize, int *pCost)
void Abc_QuickSort1(word *pData, int nSize, int fDecrease)
int * Abc_MergeSortCost(int *pCosts, int nSize)
void Abc_SortMergeCost2Reverse(int *p1Beg, int *p1End, int *p2Beg, int *p2End, int *pOut, int *pCost)
void Abc_SortCost2Reverse_rec(int *pInBeg, int *pInEnd, int *pOutBeg, int *pCost)
void Abc_QuickSort3Dec_rec(word *pData, int l, int r)
void Abc_QuickSort2(word *pData, int nSize, int fDecrease)
int Abc_QuickSort1CompareDec(word *p1, word *p2)
int * Abc_QuickSortCost(int *pCosts, int nSize, int fDecrease)
void Abc_QuickSort3Inc_rec(word *pData, int l, int r)
void Abc_QuickSort2Dec_rec(word *pData, int l, int r)
void Abc_QuickSort2Inc_rec(word *pData, int l, int r)
unsigned Abc_Random(int fReset)
int Abc_SortNumCompare(int *pNum1, int *pNum2)
void Abc_QuickSort3(word *pData, int nSize, int fDecrease)
int Abc_QuickSort1CompareInc(word *p1, word *p2)
void Abc_MergeSortCost2Reverse(int *pInput, int nSize, int *pCost)