【问题标题】:Counting comparisons and exchanges in my Shell sort program在我的 Shell 排序程序中计算比较和交换
【发布时间】:2019-09-26 23:33:34
【问题描述】:

我正在尝试计算 Shell sort 对数字数组int[] array = {1,2,3,4,5,6,7,8,9,10} 进行排序所需的比较和交换。使用现在的比较计数器 (comp) 和当前的交换计数器 (exch),我得到 22 次比较和零次交换。我相信零交换是正确的,因为它显然是一个排序数组,因此不需要交换。对于 10 个元素的数组,我认为 22 次比较是不正确的。有人可以告诉我这些表达式需要在哪里并解释原因吗?我将不胜感激。

public static void shellSort(int[] array) {
    int interval = array.length / 2;
    int comp = 0, exch = 0;
    while (interval != 0) {
        for (int i = 0; i < interval; i++) {
            for (int p = i + interval; p < array.length; p += interval) {
                int key = array[p];
                int j = p - interval;
                while (j >= 0) {
                    comp++;         //Comparison here
                    if (key < array[j]) {
                        array[j + interval] = array[j];
                    } else
                        break;
                    exch++;     //Exchange here
                    j -= interval;
                }
                array[j + interval] = key;
            }
        }
        interval /= 2;
    }
}

【问题讨论】:

    标签: java shellsort


    【解决方案1】:

    来自the theory

    {1,2,3,4,5,6,7,8,9,10}

    1. 有间隙5 (10 &gt;&gt;&gt; 1):

      {1,6}{2,7}{3,8}{4,9}{5,10}
        ^    ^    ^    ^    ^    --> 5 comparisons
      
    2. 有间隙2 (5 &gt;&gt;&gt; 1):

      {1,3,5,7,9}{2,4,6,8,10}
        ^ ^ ^ ^    ^ ^ ^ ^    --> 8 comparisons
      
    3. 有间隙1 (2 &gt;&gt;&gt; 1):

      {1,2,3,4,5,6,7,8,9,10}
        ^ ^ ^ ^ ^ ^ ^ ^ ^    --> 9 comparisons
      

    总计:22 次比较。问题出在哪里? :)

    更新

    10,9,8,7,6,5,4,3,2,1

    1. 有间隙5 (10 &gt;&gt;&gt; 1):

      10,5  9,4  8,3  7,2  6,1
        ê    ê    ê    ê    ê  --> 5c, 5e
      

    5,4,3,2,1,10,9,8,7,6

    1. 有间隙2 (5 &gt;&gt;&gt; 1):

      5,3,1,9,7
      
      5,3 
       ê        --> 1c, 1e --> 3,4,5,2,1,10,9,8,7,6
      3,5,1                    ‾   ‾
       ê ê      --> 2c, 2e --> 1,4,3,2,5,10,9,8,7,6
      1,3,5,9                  ‾   ‾   ‾
           ^    --> 1c
      1,3,5,9,7
           ^ ê  --> 2c, 1e --> 1,4,3,2,5,10,7,8,9,6
                                            ‾   ‾   
      4,2,10,8,6
      
      4,2
       ê         --> 1c, 1e --> 1,2,3,4,5,10,7,8,9,6
      2,4,10                      ‾   ‾
         ^       --> 1c
      2,4,10,8
         ^  ê    --> 2c, 1e --> 1,2,3,4,5,8,7,10,9,6
      2,4,8,10,6                          ‾   ‾‾
         ^ ê  ê  --> 3c, 2e --> 1,2,3,4,5,6,7,8,9,10
                                          ‾   ‾   ‾‾ 
      
    2. 有间隙1 (2 &gt;&gt;&gt; 1):

      1,2,3,4,5,6,7,8,9,10
       ^ ^ ^ ^ ^ ^ ^ ^ ^   --> 9c
      

    我一共来了 27 次比较和 13 次交流。

    我很确定您现在可以自己完成最后一次纸笔测试。 :)

    【讨论】:

    • 那么你能告诉我如何解决它,以便比较和交流是正确的吗?
    • @dantheDude 非常抱歉。我犯了一个错误。在 2 之下。我按行计算,但它必须按列计算(=一个子数组接一个)。我相应地调整了我的答案。
    猜你喜欢
    • 2015-05-21
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    相关资源
    最近更新 更多