[英]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}
间隙5
( 10 >>> 1
):
{1,6}{2,7}{3,8}{4,9}{5,10} ^ ^ ^ ^ ^ --> 5 comparisons
有间隙2
( 5 >>> 1
):
{1,3,5,7,9}{2,4,6,8,10} ^ ^ ^ ^ ^ ^ ^ ^ --> 8 comparisons
带间隙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
间隙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
有间隙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 ‾ ‾ ‾‾
带间隙1
( 2 >>> 1
):
1,2,3,4,5,6,7,8,9,10 ^ ^ ^ ^ ^ ^ ^ ^ ^ --> 9c
我一共来了27次比较和13次交流。
我很确定你现在可以自己完成最后一次纸笔测试了。 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.