繁体   English   中英

在我的 Shell 排序程序中计数比较和交换

[英]Counting comparisons and exchanges in my Shell sort program

我正在尝试计算 Shell 排序以对数字数组进行排序所需的比较和交换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;
    }
}

理论

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

  1. 间隙5 ( 10 >>> 1 ):

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

     {1,3,5,7,9}{2,4,6,8,10} ^ ^ ^ ^ ^ ^ ^ ^ --> 8 comparisons
  3. 带间隙1 ( 2 >>> 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 >>> 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 >>> 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 >>> 1 ):

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM