- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
对于两种不同的排序,我有两个实现,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;
}
}
壳排序:
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;
}
}
我还有 10 个整数数组,其中包含 32000 个整数。在我调用这些类中的静态 sortArray 方法之前,我得到了时间。以下是结果:
对于 InsertionSort.sortArray:
Solving array with: 32000 elements.
Time in milliseconds:264
Time in milliseconds:271
Time in milliseconds:268
Time in milliseconds:263
Time in milliseconds:259
Time in milliseconds:257
Time in milliseconds:258
Time in milliseconds:260
Time in milliseconds:259
Time in milliseconds:261
对于 ShellSort:
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
那么为什么它们之间会有如此大的差异呢?它们基本上是相同的算法?
此外,为什么 ShellSort 的前 2 次运行时间更长,而其余的运行时间更快?
这是 128000 个元素的结果,再次是 InsertionSort:
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
壳排序:
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;
}
}
你在内层循环中从数组中读取值,当前面位置的值不小于时,你将两个值写入数组。
在 shell 排序中,
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;
}
您读取要放置的值一次,在内循环之外,在内循环体中只有一次写入,在内循环之后只写入一次值。
这样效率更高,因此 shell 排序更快是可以理解的。前两个 shell 排序较慢可能是因为包装
for (int gap = a.length / a.length; gap > 0; gap = (gap / 2)) {
在 JIT 注意到 gap
可以替换为 1 并消除包装循环之前,它会混淆一段时间。
关于java - InsertionSort 与间隙大小 = 1 的 ShellSort?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16501597/
尝试根据用户关注者的数量对推文对象进行排序。数据和对象键是从 mysql 数据库自定义的,其中包含我一直在为应用程序构建收集的数据。我有一个名为 dstore 的数组,包含如下所示的各个对象: # {
我想自己实现 shellsort 而不是在线复制粘贴那些,如果有人能帮助我找到错误并改进我愚蠢的 lil 代码,我将不胜感激我会把我的代码放在下面 #include #include using
我在编写简单程序对随机数数组进行 shellsort 时遇到了问题。程序不会对它进行排序,只是打印 1,1,1,1,1 或 0,0,0,0,0,即使 shellsort 算法来自 Rosettacod
我需要一种在 C# 中使用 ShellSort 对数组进行排序的简单方法,请帮助我 最佳答案 使用 shell 排序。 关于c# - 类作业 - C# 中的 shellsort?,我们在Stack O
这段代码是由 Ritchie 用 ANSI C 编写的......我在这段代码中使用了我怀疑的注释。我还从 youtube 上学习了 shell 排序,并理解了它实际上是如何工作的,但是这段代码非常令
对于两种不同的排序,我有两个实现,InsertionSort 和 ShellSort。 它们如下: 插入排序: for (int pos = 0; pos 0; secondMarker--) {
void shellsort(int v[], int n) { int gap, i, j, temp; for (gap = n/2; gap > 0; gap /= 2)
我正在尝试将 C 函数转换为 32 位 NASM。 这是 C 函数 void shellsort (int *A, int n) { int gap, i, j, temp; for
有人可以提供一个使用 Knuth 序列的 Java shellsort 的简单工作示例吗?我在互联网上查看了几个地方,但找不到适合我的解释。我在概念层面上理解 shellsort - 因为它是一种插入
简介 Shellsort 是我不久前遇到的一种有趣的排序算法。最神奇的是,不同的空位序列可以显着提高算法的速度。我读了一些书(没有广泛阅读),似乎 Tokuda 的序列被推荐用于实际应用。 另一个有趣
我正在编写一个程序来对数字数组执行 shellsort。我首先必须生成将执行 shellsort 的数字序列。该函数用于生成 2^p*3^q 形式的数字,该数字小于要排序的数组的长度。然后我对刚刚生成
我试图理解 K&R 书中第 62 页的 ShellSort 代码。但有一部分我不确定。 下面是书中的原始代码: void shellsort(int* v, int n) { int gap,
以下是来自普林斯顿的 coursera 算法类(class)的练习。 如果一个数组既是 3 次排序又是 5 次排序,那么它是否也是 6 次、7 次、8 次、9 次和 10 次排序?我知道任何序列如果先
我是一名优秀的程序员,十分优秀!