Java 快速排序/插入排序组合比快速排序慢?
我运行快速排序10次,得到平均时间。 我对Qicksort/Insertion-sort组合也做了同样的事情,它似乎比快速排序慢 下面是我调用InsertionSort的代码部分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 >
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语句的存在对整体计算的影响更大。