java - 查找此特定快速排序算法中的比较次数

标签 java algorithm sorting quicksort

我有一个快速排序算法,我想返回其中的比较次数,但我无法对给定的算法进行任何处理。我必须返回比较形式 getCompares() 函数。我在网上查了很多地方,但没有找到合适的解决方案。没有。的比较 已排序大小为 100 的数据应给出 488 作为结果。

/**
 * Quicksort algorithm.
 * @param a an array of Comparable items.
 */

public static void QuickSort( Comparable [ ] a )

{
    quicksort( a, 0, 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, low, middle );
        if( a[ high ].compareTo( a[ low ] ) < 0 )
            swapReferences( a, low, high );
        if( a[ high ].compareTo( a[ middle ] ) < 0 )
            swapReferences( a, middle, high );

            // Place pivot at position high - 1
        swapReferences( a, middle, 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, i, high - 1 );

        quicksort( a, low, 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 low, 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;
    }
}

最佳答案

实现此目的的最简单方法是创建一个内部方法来比较 2 个 Comparable 对象,该方法计算调用次数并替换所有 compareTo 调用调用该方法。

private int comparisons = 0;

private int compare(Comparable<?> obj1, Comparable<?> obj2) {
    comparisons++;
    return obj1.compareTo(obj2);
}

然后将 tmp.compareTo(a[j-1]) 等表达式替换为 compare(tmp, a[j-1])

您的 getCompares 方法将返回比较

需要考虑的其他一些技巧:

理想情况下不要使用静态方法和变量。制作一个 QuickSort 类,在使用前需要实例化。

最好不要使用原始类型(例如代码中的Comparable)。大多数现代 IDE 都会正确地警告这种危险。使用通配符(如上所述),或者更好的是,实际上向您的 QuickSort 类添加泛型类型:

class QuickSort<T extends Comparable<T>> {
    public void sort(T[] array) { ... }
}

QuickSort<Integer> intSorter = new QuickSort<>();
int[] array = {5, 8, 2};
intSorter.sort(array);

这将允许编译时检查您没有混合不兼容的类型。您当前的原始类型不允许 Java 执行此操作。

关于java - 查找此特定快速排序算法中的比较次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59061755/

相关文章:

java - 根据给定的字符串显示数轴

algorithm - 合并而不丢失最准确的顺序

objective-c - 用长整数制作唯一可读的字符串

c++ - 在 C++ 中使用泰勒级数求数字的自然对数

java - mapreduce,排序值

perl - 基本的 Perl 散列排序键,值,但也键 AND 值

java - 在 org.w3c.dom.Document 中搜索属性的最快方法

java - "Overriding"子类型 : Possible risks? 中的实例变量

wordpress - Woocommerce 更改客户名称顺序

java - 创建 WebMVCConfig 资源 [/com.chat.config/] 中定义的名称为 'resolver' 的 bean 时出错