我有一个用于Quick-Sort的算法,我想返回其中的比较数,但是我无法使用给定的算法做任何事情。我必须返回比较形式的getcompares()函数。我已经在线检查了很多地方,但没有找到适当的解决方案。没有的比较 已经排序的大小为100的数据应为488。
/**
* Quicksort algorithm.
* @param a an array of Comparable items.
*/
public static void QuickSort( Comparable [ ] a )
{
quicksort( a,a.length - 1 );
}
private static final int CUTOFF = 10;
/**
* Method to swap to elements in an array.
* @param a an array of objects.
* @param index1 the index of the first object.
* @param index2 the index of the second object.
*/
public static final void swapReferences( Object [ ] a,int index1,int index2 )
{
Object tmp = a[ index1 ];
a[ index1 ] = a[ index2 ];
a[ index2 ] = tmp;
}
/**
* Internal quicksort method that makes recursive calls.
* Uses median-of-three partitioning and a cutoff of 10.
* @param a an array of Comparable items.
* @param low the left-most index of the subarray.
* @param high the right-most index of the subarray.
*/
private static void quicksort( Comparable [ ] a,int low,int high )
{
if( low + CUTOFF > high )
insertionSort( a,low,high );
else
{
// Sort low,middle,high
int middle = ( low + high ) / 2;
if( a[ middle ].compareTo( a[ low ] ) < 0 )
swapReferences( a,middle );
if( a[ high ].compareTo( a[ low ] ) < 0 )
swapReferences( a,high );
if( a[ high ].compareTo( a[ middle ] ) < 0 )
swapReferences( a,high );
// Place pivot at position high - 1
swapReferences( a,high - 1 );
Comparable pivot = a[ high - 1 ];
// Begin partitioning
int i,j;
for( i = low,j = high - 1; ; )
{
while( a[ ++i ].compareTo( pivot ) < 0 )
;
while( pivot.compareTo( a[ --j ] ) < 0 )
;
if( i >= j )
break;
swapReferences( a,i,j );
}
// Restore pivot
swapReferences( a,high - 1 );
quicksort( a,i - 1 ); // Sort small elements
quicksort( a,i + 1,high ); // Sort large elements
}
}
/**
* Internal insertion sort routine for subarrays
* that is used by quicksort.
* @param a an array of Comparable items.
* @param low the left-most index of the subarray.
* @param n the number of items to sort.
*/
private static void insertionSort( Comparable [ ] a,int high )
{
for( int p = low + 1; p <= high; p++ )
{
Comparable tmp = a[ p ];
int j;
for( j = p; j > low && tmp.compareTo( a[ j - 1 ] ) < 0; j-- )
a[ j ] = a[ j - 1 ];
a[ j ] = tmp;
}
}