Shell Sort Minimum Comparisons

时间:2016-01-20 01:02:08

标签: algorithm performance time-complexity shellsort

给定5,1的差距列表,shell排序对8个项目的列表进行排序所需的最小比较数是多少?

我理解最好的案例表现是一个n(log(n))案例,但是我无法通过数学来获得将给定数字放入所需的完整表达式以获得最小数量的比较。

2 个答案:

答案 0 :(得分:0)

不,当元素的数量是任意大的n时,人们会谈到不对称的时间。当你有一个确切数量的元素时,它们的数量是不变的。因此它是O(1)

一般来说,只有BC O(n log n)用于处理" n"元素。但是,人们通常对WC更感兴趣。

在这里你需要手工完成它或者编写一个计算它们的简单程序。

来自伪代码:

# Sort an array a[0...7].
gaps = [5, 1]
foreach (gap in gaps) {
    for (i = gap; i < n; i += 1) {
        temp = a[i]
        for (j = i; j >= gap and a[j - gap] > temp; j -= gap)
            a[j] = a[j - gap]

            a[j] = temp
    }
}

插入数字现在很简单。

只是为了做到这一点,因为你不知道元素的价值,你只能在WC看。从上面的代码中我们得到5的差距5,6,7,因为j = i; j >= gap; j -= gap,内部循环也会为每一个执行一次。对于间隙1,您在外部for循环中有1..7,然后在每次执行时减少(WC!)1。总而言之:

  

间隙(5)+间隙(1)=(1 + 1 + 1)+(1 + 2 + 3 + 4 + 5 + 6 + 7)= 31

答案 1 :(得分:0)

对于shellsort所需的最小比较次数,您需要输入一个专门针对所选间隙序列定制的近似排序的载体。

shellsort的最后一步是插入排序。当您输入排序数据时,没有其他排序方法比插入排序更快,它只需要n-1次比较。

shellort背后的想法是对远离的值进行预先排序,以便铺设&#34;地面铺设&#34;用于插入排序以执行尽可能少的比较。反向输入序列对于插入排序来说是比较成本最高的,它需要n *(n-1)/ 2个比较。如果进行预排序 - 无论间隙顺序如何 - 最终插入排序比单独使用插入排序需要更少的比较。但是,当你总结预排序中的比较次数并将它们添加到最终插入排序中的比较时,如果你设法改进了基本插入排序的结果,就会发现它们。

有两个数据序列 - 给定n = 8 - 在插入类型中需要相同数量的比较:

"01234567" and
"10234567" though this causes a swap of "1" and "0"

在任何情况下,都需要n-1 =&gt; 7比较。

当我们添加5-gap时,它将增加3个比较:s [0]与s [5],s [1]与s [6]和s [2]与s [7]。鉴于前面提到的两个插入排序向量,我们发现比较应该如下为最小比较插入排序铺平道路:

s[0] with s[5] - "0"w"5" and "5"w"0" xor "1"w"5" and "5"w"1"
s[1] with s[6] - "1"w"6" and "6"w"1" xor "0"w"6" and "6"w"0"
s[2] with s[7] - "2"w"7" and "7"w"2"

因为前两个比较案例有&#34; 0&#34;和&#34; 1&#34;一般来说,你不能拥有&#34; 0&#34;在两者或&#34; 1&#34;同时。如果&#34; 0&#34;是第一次比较的一部分然后&#34; 1&#34;是第二部分,反之亦然。

当gap = {5,1}和n = 8时,这给出了以下序列以实现最小(3 + 7)比较shellort:

                      5-gap                               1-gap (insertion sort)
"01234567" - 0 swaps
"01734562" - 1 swaps:                         "7"w"2"
"06234517" - 1 swaps:             "6"w"1"
"06734512" - 2 swaps:             "6"w"1" and "7"w"2"
"51234067" - 1 swaps: "5"w"0"
"51734062" - 2 swaps: "5"w"0" and             "7"w"2"
"56234017" - 2 swaps: "5"w"0" and "6"w"1"
"56734012" - 3 swaps: "5"w"0",    "6"w"1" and "7"w"2"
"10234567" - 1 swaps:                                     "1"w"0"
"10734562" - 2 swaps:                         "7"w"2" and "1"w"0"
"16234507" - 2 swaps:             "6"w"0" and             "1"w"0"
"16734502" - 3 swaps:             "6"w"0",    "7"w"2" and "1"w"0"
"50234167" - 2 swaps: "5"w"1" and                         "1"w"0"
"50734162" - 3 swaps: "5"w"1",                "7"w"2" and "1"w"0"
"56234107" - 3 swaps: "5"w"1",    "6"w"0" and             "1"w"0"
"56734102" - 4 swaps: "5"w"1",    "6"w"0",    "7"w"2" and "1"w"0"

总共有16个序列导致总共8个中的最小比较shellort!或40320可能的序列。

当n = 8时,可能的2 ^(n-2)或64个可能的间隙序列中,{5,1}是最好的(平均@ 17.4比较),紧随其后的是{6,1},{7,按顺序排列5,1},{7,4,1},{4,1}和{3,1}。它们都需要平均少于18次比较。插入排序平均需要19.3次比较。

这些间隙序列的其他特征(包括用于比较的插入排序):

                    number of comparisons
                    in a                             when
gap sequence        minimum sort      maximum sort   input sequence reversed
{1} (insertion sort)        7                28                    28
{3,1}                      12                24                    19
{4,1}                      11                26                    20
{5,1}                      10                24                    15
{6,1}                       9                25                    16
{7,4,1}                    12                24                    15
{7,5,1}                    11                23                    17