Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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 InsertionSort与ShellSort,间隙大小=1?_Java_Algorithm_Sorting_Insertion Sort_Shellsort - Fatal编程技术网

Java InsertionSort与ShellSort,间隙大小=1?

Java InsertionSort与ShellSort,间隙大小=1?,java,algorithm,sorting,insertion-sort,shellsort,Java,Algorithm,Sorting,Insertion Sort,Shellsort,我有两个用于两种不同排序的实现,InsertionSort和ShellSort 详情如下: 插入排序: for (int pos = 0; pos < arrayToBeSorted.length; pos++) { for (int secondMarker = pos; secondMarker > 0; secondMarker--) { int currentValue = arrayToBeSorted[secondMarker];

我有两个用于两种不同排序的实现,InsertionSort和ShellSort

详情如下:

插入排序:

for (int pos = 0; pos < arrayToBeSorted.length; pos++) {
    for (int secondMarker = pos; secondMarker > 0; secondMarker--) {
        int currentValue = arrayToBeSorted[secondMarker];
        int valueBeingCheckedAgainst = arrayToBeSorted[secondMarker - 1];
        if (currentValue > valueBeingCheckedAgainst) {
            break;
        }
        arrayToBeSorted[secondMarker] = arrayToBeSorted[secondMarker - 1];
        arrayToBeSorted[secondMarker - 1] = currentValue;
    }
}
对于ShellSort:

for (int gap = a.length / a.length; gap > 0; gap = (gap / 2)) {
    for (int i = gap; i < a.length; i++) {
        int tmp = a[i];
        int j = i;
        for (; j >= gap && tmp < (a[j - gap]); j -= gap) {
            a[j] = a[j - gap];
        }
        a[j] = tmp;
    }
}
Solving array with: 32000 elements.
Time in milliseconds:357
Time in milliseconds:337
Time in milliseconds:167
Time in milliseconds:168
Time in milliseconds:165
Time in milliseconds:168
Time in milliseconds:167
Time in milliseconds:167
Time in milliseconds:166
Time in milliseconds:167
Solving array with: 128000 elements.
Time in milliseconds:5358
Time in milliseconds:5335
Time in milliseconds:2676
Time in milliseconds:2656
Time in milliseconds:2662
Time in milliseconds:2654
Time in milliseconds:2661
Time in milliseconds:2656
Time in milliseconds:2660
Time in milliseconds:2673
那么,它们之间为什么会有这么大的差异呢?它们基本上是相同的算法

另外,ShellSort的前两次运行耗时更长,而其余运行更快,这怎么可能呢

这是128000个元素的结果,再次插入排序:

Solving array with: 128000 elements.
Time in milliseconds:4292
Time in milliseconds:4267
Time in milliseconds:4241
Time in milliseconds:4252
Time in milliseconds:4253
Time in milliseconds:4248
Time in milliseconds:4261
Time in milliseconds:4260
Time in milliseconds:4333
Time in milliseconds:4261
ShellSort:

for (int gap = a.length / a.length; gap > 0; gap = (gap / 2)) {
    for (int i = gap; i < a.length; i++) {
        int tmp = a[i];
        int j = i;
        for (; j >= gap && tmp < (a[j - gap]); j -= gap) {
            a[j] = a[j - gap];
        }
        a[j] = tmp;
    }
}
Solving array with: 32000 elements.
Time in milliseconds:357
Time in milliseconds:337
Time in milliseconds:167
Time in milliseconds:168
Time in milliseconds:165
Time in milliseconds:168
Time in milliseconds:167
Time in milliseconds:167
Time in milliseconds:166
Time in milliseconds:167
Solving array with: 128000 elements.
Time in milliseconds:5358
Time in milliseconds:5335
Time in milliseconds:2676
Time in milliseconds:2656
Time in milliseconds:2662
Time in milliseconds:2654
Time in milliseconds:2661
Time in milliseconds:2656
Time in milliseconds:2660
Time in milliseconds:2673

我确信我传递给方法的数组是完全相同的,它们是随机的。

在插入排序中,您将变得更加复杂

for (int pos = 0; pos < arrayToBeSorted.length; pos++) {
    for (int secondMarker = pos; secondMarker > 0; secondMarker--) {
        int currentValue = arrayToBeSorted[secondMarker];
        int valueBeingCheckedAgainst = arrayToBeSorted[secondMarker - 1];
        if (currentValue > valueBeingCheckedAgainst) {
            break;
        }
        arrayToBeSorted[secondMarker] = arrayToBeSorted[secondMarker - 1];
        arrayToBeSorted[secondMarker - 1] = currentValue;
    }
}

在JIT注意到可以用1替换
gap
并消除包装循环之前,它会混淆JIT一段时间。

在插入排序中,您会变得更复杂

for (int pos = 0; pos < arrayToBeSorted.length; pos++) {
    for (int secondMarker = pos; secondMarker > 0; secondMarker--) {
        int currentValue = arrayToBeSorted[secondMarker];
        int valueBeingCheckedAgainst = arrayToBeSorted[secondMarker - 1];
        if (currentValue > valueBeingCheckedAgainst) {
            break;
        }
        arrayToBeSorted[secondMarker] = arrayToBeSorted[secondMarker - 1];
        arrayToBeSorted[secondMarker - 1] = currentValue;
    }
}

在JIT注意到
gap
可以替换为1并消除包装环之前,它会混淆JIT一段时间。

感谢您的回答。我取int currentValue=arrayToBeSorted[secondMarker];搞不清状况(它没有排列成一行[pos]。正如您所说,现在我得到的值大约为3300毫秒,但它仍然没有我的ShellSort实现快。谢谢。复制Shell排序代码,但用1替换
gap
。然后时间应该相等,或者插入排序快一点。谢谢您的回答。我接受了int currentValue=arrayToBeSorted[secondMarker];超出循环。(它不是arrayToBeSorted[pos]。正如您所说,现在我得到的值大约为3300毫秒,但仍然没有我的ShellSort实现快。谢谢。复制Shell排序代码,但将
gap
替换为1。然后时间应该相等,或者插入排序快一点。