【发布时间】:2015-08-24 18:21:54
【问题描述】:
我正在做一个实验来比较 Thomas Hibbard 的 shell 排序(间隙大小 = 2^k-1)和 Donald Shell 的 shell 排序(n/2^k)在同一个数组上的执行情况。当数组的大小从 10 到 1000 时,Hibbard 的性能优于 shell。但是当大小达到 10000 或更高时,shell 排序比 Hibbard 快。
按照大O表示法,Hibbard是O(N^1.5),Shell是O(N^2),这让我觉得随着数据集规模的增加,Hibbard应该比Shell有更大的改进。谁能告诉我为什么我的结果可能不如预期?
我知道 O 表示法是最坏情况下的复杂度,但似乎性能应该更好地与该表示法保持一致。
这是我用 JAVA 编写的代码: (注意:unsortedArray 之前已声明并初始化)
{
int temp;
int[] sortedArray = unsortedArray.clone();
printArray();
int k = (int)(Math.log(sortedArray.length)/Math.log(2));
int gap = (int)(Math.pow(2,k)-1);
int count = 0;
long endTime;
long startTime = System.nanoTime();
while (gap > 0)
{
for (int g = 0; g < gap; g++)
{
for (int d = g + gap; d < sortedArray.length; d = d + gap)
{
for (int i = d; i - gap >= 0; i = i - gap)
{
if (sortedArray[i - gap] <= (sortedArray[i]) )
{
break;
}
count++;
temp = sortedArray[i];
sortedArray[i] = sortedArray [i-gap];
sortedArray[i-gap] = temp;
}
}
}
k = k -1;
gap = (int)(Math.pow(2,k)-1);
}
endTime = System.nanoTime();
System.out.println("The total time for hibbard sort is" + (endTime-startTime));
System.out.println("the number of swaps for hibbard sort is" + count);
}
【问题讨论】:
-
请注意该代码用于 Hibbard 的 shell 排序。
-
根据“缓存未命中”而不是“交换”或“比较”来衡量复杂性可能会提供信息。
标签: algorithm sorting time-complexity shellsort