各位大大好,最近在自学算法,碰到了一点问题。来请求各位,还望各位不要嫌弃。
插入排序:对于随机排列长度为 N 且主见不重复的数组,平均情况下插入排序需要~N^2/4
次比较以及~N^2/4
。最坏情况下需要~N^2/2
次比较和~N^2/2
次交换。
希尔排序是基于插入排序所改进的算法。书上是这样描述的:中心思想是使数组中任意间隔为 h 的元素都是有序的。这样的数组被称为 h 有序数组。也就是说,一个 h 有序数组就是 h 个互相独立的有序数组编织在一起组成一个数组。 这样说我是能够理解的,但是它的代码有点令我难以理解。
//一些简单的通用性代码就不粘贴了,减少篇幅,以免各位看官看的烦
public static void sort(Comparable[] a) {
int n = a.length;
// 3x+1 increment sequence: 1, 4, 13, 40, 121, 364, 1093, ...
int h = 1;
while (h < n/3) h = 3*h + 1;
while (h >= 1) {
for (int i = h; i < n; i++) {、
//less 是用来比较大小的, a[j]<[j-h]
for (int j = i; j >= h && less(a[j], a[j-h]); j -= h) {
//交换 a[j]和 a[j-h]的位置
exch(a, j, j-h);
}
}
assert isHsorted(a, h); //判断是否有序的代码
h /= 3;
}
assert isSorted(a);
}
h=3*h+1
?这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.