Shell Sort与Insertion / Bubble Sort有什么好处?

时间:2010-11-03 22:23:23

标签: sorting

我的教授给了我以下Shell Sort的定义。我也包括了Bubble和Insertion Sort算法。

使用Shell Sort与使用gap=1的常规插入排序或冒泡排序有什么好处?最终,壳牌排序归结为无论如何,对吗?

我不是要你做我的作业。我合法地感到困惑,想要了解发生了什么。

另外,我已经访问了维基百科,看过时间复杂度表,我已经知道他们说了什么。我正在寻找为什么,而不是是什么

def shell(a, n):
    gap = n / 2

    while gap >= 1:
            insertion(a, n, gap) # or bubble
            gap /= 2

def bubble(a, n, gap=1):
    for i in range(n):
            for j in range(n-i-gap):
                    if a[j] > a[j+gap]:
                            swap(a, j, j+1)

def insertion(a, n, gap=1):
    for i in range(1,n):
            x = a[i]
            j = i-gap

            while j>=0 and  a[j]>x:
                    a[j+gap] = a[j]
                    j-=gap

            a[j+gap]=x

3 个答案:

答案 0 :(得分:6)

Shell排序允许交换相距很远的索引,其中冒泡排序仅交换相邻的项目。

上的维基百科条目

掩盖差异。

编辑:

想象一下,你手里拿着一堆牌,牌几乎是有序的,除了第一张和最后一张牌都是换了。冒泡排序会很痛苦,因为有大约2n个交换,插入排序会更好用n个交换,但shell排序可以在1中完成。(交换数量因算法实现而异,这只是一个例子)

答案 1 :(得分:0)

shell排序的逻辑是对最远离的条目进行排序。给定一个部分排序的列表,理论上可以比O(n ^ 2)快得多。同样给出一个大的未排序数组,最终排序位置远离当前位置的概率很高。从逻辑上讲,使用更大的差距是有意义的。但shell排序的要点并不是它的性能,而是算法的简单性和堆栈内存的低使用率。

鉴于平均而言它确实优于O(n ^ 2)(取决于间隙序列),小代码大小和堆栈使用,它在内存约束是一个因素的嵌入式应用程序中非常流行。

答案 2 :(得分:-4)

差异在于效率。

插入排序和冒泡排序均为O(n ^ 2),同时Shell排序为O(n log n)。

这意味着如果你有一个包含100个元素的集合,那么使用Bubble和Insert排序的操作量是K * 100 ^ 2 = K * 10000个操作,其中K取决于其他因素,但大部分是不变的。

使用Shell Sort,所需的操作将是Q * 100 * Log 100 = Q * 100 * 2 = Q * 2000操作,其中Q取决于其他因素并且大部分是恒定的。