编程题
### 问题描述 一家知名的连锁咖啡馆决定改进其订单处理系统。为了提高效率,他们决定使用某种指定属性的希尔排序对订单进行从小到大的排序。 您的任务是编写一个程序,实现这种基于属性的希尔排序,并确定在给定的增量序列下,需要多少次比较和交换来对订单进行排序。 ### 输入格式 第一行:一个整数 $n$,表示订单的数量。 第二行:一个整数 $m$,表示增量序列的长度。 接下来的一行:包含 $m$ 个以空格分隔的整数,表示增量序列,题目保证增量序列严格递减且最后一个值为 $1$。 接下来的 $n$ 行:每行一个整数,表示订单的属性值。 ### 输出格式 两个整数,分别表示比较和交换的次数。 ### 样例输入 ``` 3 2 2 1 3 1 2 ``` ### 样例输出 ``` 3 2 ``` ### 样例说明 输入的数组为:$[3, 1, 2]$。 增量序列为:$[2, 1]$。 1. 当增量 $h = 2$: 对于每一个索引 $i$,我们会将数组元素 $arr[i]$ 与 $arr[i - h]$ 进行比较,并进行可能的交换。 - $i = 2$: $arr[2] = 2$,$arr[0] = 3$。因为 $2 < 3$,所以交换它们。 数组变为:$[2, 1, 3]$。 这里进行了 $1$ 次比较和 $1$ 次交换。 注意:对于 $i=0$ 和 $i=1$,由于它们的索引小于增量值 $2$,所以不会进行任何操作。 2. 当增量 $h = 1$: 这就是一个普通的插入排序。 - $i = 1$: $arr[1] = 1$,$arr[0] = 2$。因为 $1 < 2$,所以交换它们。 数组变为:$[1, 2, 3]$。 这里进行了 $1$ 次比较和 $1$ 次交换。 - $i = 2$: $arr[2] = 3$,$arr[1] = 2$。因为 $3 > 2$,所以不交换。 这里进行了 $1$ 次比较。 总结:总共进行了 $3$ 次比较,$2$ 次交换。 ### 测评数据规模 对于 $100$% 的数据,$n \leq 10^4$,$1\le m\le \log_2n$。
查看答案
赣ICP备20007335号-2