Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 快速排序/插入排序组合比快速排序慢?_Java_Algorithm_Quicksort_Insertion Sort - Fatal编程技术网

Java 快速排序/插入排序组合比快速排序慢?

Java 快速排序/插入排序组合比快速排序慢?,java,algorithm,quicksort,insertion-sort,Java,Algorithm,Quicksort,Insertion Sort,我运行快速排序10次,得到平均时间。 我对Qicksort/Insertion-sort组合也做了同样的事情,它似乎比快速排序慢 下面是我调用InsertionSort的代码部分 public static <T extends Comparable<? super T>> void OptQSort2 (T[] data, int min, int max) { int indexofpartition; if(max - min >

我运行快速排序10次,得到平均时间。 我对Qicksort/Insertion-sort组合也做了同样的事情,它似乎比快速排序慢

下面是我调用InsertionSort的代码部分

public static <T extends Comparable<? super T>> void OptQSort2 (T[] data, int min, int max) {
        int indexofpartition;
        if(max - min > 0) {
            if( (max - min) <= 10) {
                // Use InsertionSort now
                InsertionSort.sort(data);
                return;
            } else {
                indexofpartition = findPartition(data, min, max);

                OptQSort2(data, min, indexofpartition - 1);

                OptQSort2(data, indexofpartition + 1, max);
            }
        }

}

你知道为什么吗?序列的大小重要吗?我将使用1000个元素的整数[]数组进行此测试

您将需要一个更大的整数数组,以便测试具有相关性。此时,在QS+IS情况下,可能测试if条件会减慢算法的速度


测试大量数字,并在数据大小足以容纳一级缓存(即32-64kb)时切换到IS。

您将需要一个更大的整数数组,以便测试相关。此时,在QS+IS情况下,可能测试if条件会减慢算法的速度


测试大量数字,并在数据大小足以容纳一级缓存(即32-64kb)时切换到IS。

第一个可疑的显然是插入排序方法。比如说,它真的有点像吗


您还需要对它进行多次测试,以预热JVM。而且还要在两个顺序中测试它们,这样一个就不会从另一个进行的热身中受益。我建议进行100或1000次测试。而且它们也必须在同一个数据集上。

第一个怀疑显然是您的插入排序方法。比如说,它真的有点像吗


您还需要对它进行多次测试,以预热JVM。而且还要在两个顺序中测试它们,这样一个就不会从另一个进行的热身中受益。我建议进行100或1000次测试。而且它们也必须位于同一个数据集上。

OptQSort2
中,对于小分区,您有以下函数调用:

InsertionSort.sort(data);
这应该是小分区吗?看起来您正在对整个数组进行插入排序。您不应该将
min
max
索引传递给
InsertionSort


另一种选择是在
OptQSort2
期间不在小分区上工作。然后在
OptQSort2
完成其工作后,对整个数组执行一次
InsertionSort
传递。

OptQSort2
中,对于小分区,您有以下函数调用:

InsertionSort.sort(data);
这应该是小分区吗?看起来您正在对整个数组进行插入排序。您不应该将
min
max
索引传递给
InsertionSort


另一种选择是在
OptQSort2
期间不在小分区上工作。然后在
OptQSort2
完成其工作后,对整个数组执行一次
InsertionSort
传递。

每次拥有最多10个元素的子数组时,不应调用
InsertionSort
。不要做任何事:

public static <T extends Comparable<? super T>> void OptQSort2 (T[] data, int min, int max) {
    int indexofpartition;
        if( (max - min) > 10) {
            indexofpartition = findPartition(data, min, max);

            OptQSort2(data, min, indexofpartition - 1);

            OptQSort2(data, indexofpartition + 1, max);
        }

}

publicstatic每次拥有最多10个元素的子数组时,不应调用
InsertionSort
。不要做任何事:

public static <T extends Comparable<? super T>> void OptQSort2 (T[] data, int min, int max) {
    int indexofpartition;
        if( (max - min) > 10) {
            indexofpartition = findPartition(data, min, max);

            OptQSort2(data, min, indexofpartition - 1);

            OptQSort2(data, indexofpartition + 1, max);
        }

}

public static是
InsertionSort.sort()
implemented recursive order命令吗?如果没有看到QucikSort和InsertionSort的实现,就无法判断。这是一个巨大而意外的差异。
InsertionSort.sort
do究竟是什么?是
InsertionSort.sort()
实现的递归排序命令吗?如果没有看到QucikSort和InsertionSort的实现,就不可能知道。这是一个巨大而意想不到的差异。
InsertionSort.sort
到底做了什么?如果
让它慢了10倍,那就多加一个
?你一定是在开玩笑。是的,它一定很小,否则数字太大,无法对1000个整数进行排序。单位的选择不可能影响比率,除非单位太小。这取决于排序与评估if的相对时间。前者取决于输入,后者是常数。他说他正在对1000个整数进行排序,这需要非常少的时间。在这种情况下,if语句的存在对整个计算有更大的影响。额外的一个
if
会使它慢10倍吗?你一定是在开玩笑。是的,它一定很小,否则数字太大,无法对1000个整数进行排序。单位的选择不可能影响比率,除非单位太小。这取决于排序与评估if的相对时间。前者取决于输入,后者是常数。他说他正在对1000个整数进行排序,这需要非常少的时间。在这种情况下,if语句的存在对整体计算的影响更大。