编程题
### 问题描述
一家知名的连锁咖啡馆决定改进其订单处理系统。为了提高效率,他们决定使用某种指定属性的希尔排序对订单进行从小到大的排序。
您的任务是编写一个程序,实现这种基于属性的希尔排序,并确定在给定的增量序列下,需要多少次比较和交换来对订单进行排序。
### 输入格式
第一行:一个整数 $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$。