在以下算法中,在第3个定义中,首先是:
有:a[k++] = (a[j] < b[i]) ? a[j++] : b[i++].
我知道RHS是一个条件性的说明,说明如果满足了第一操作数,那么我们应该执行第二个操作数,如果不满足,我们应该执行第三个操作数。
a[k++]
, a[j++]
和 b[i++]
对应于什么元素?
从我的理解中,这应该意味着每个连续的循环中,元素会增加。
即。从第一个while loop开始初始化值(i=1
,j=m+1
,k=1
),下一个while loop将包含( i=2
, j=m+2
, k=2
)等等。
这是整个算法:
# split in half
m = n / 2
# recursive sorts
sort a[1..m]
sort a[m+1..n]
# merge sorted sub-arrays using temp array
b = copy of a[1..m]
i = 1, j = m+1, k = 1
while i <= m and j <= n,
a[k++] = (a[j] < b[i]) ? a[j++] : b[i++]
→ invariant: a[1..k] in final position
while i <= m,
a[k++] = b[i++]
→ invariant: a[1..k] in final position
a[k]
取用数组a
的k
元素。
k++
增加了k
的值,但返回上一个值。
因此,a[k++]
返回a[k]
,并在返回a[k]
的值后增加k
的副作用。a[k++] = 4
等于:
a[k] = 4
k = k + 1
另一方面,++k
在返回之前会增加k
,因此a[++k] = 4
将是
k = k + 1
a[k] = 4
增量和减少操作员在数组下标与在其他位置的工作相同。Postfix版本会增加变量并返回其原始值,前缀版本会增加变量并返回其新值。
int i = 0;
do {
if (i++) { std::cout << "i > 0" << std::endl; }
} while (i < 10);
// Checks "i"'s original value.
// First check fails, because i was 0 before incrementing.
// Outputs line 9 times.
// -----
int i = 0;
do {
if (++i) { std::cout << "i > 0" << std::endl; }
} while (i < 10);
// Checks "i"'s incremented value.
// First check succeeds, because i is incremented before being read.
// Outputs line 10 times.
同样,如果我们有:
int arr[5] = { 1, 2, 3, 4, 5 };
int i = 0;
do {
std::cout << arr[i++] << std::endl;
} while (i < 5);
变量的原始值将用作索引,输出将为:
1
2
3
4
5
但是,如果我们有:
int arr[5] = { 1, 2, 3, 4, 5 };
int i = 0;
do {
std::cout << arr[++i] << std::endl;
} while (i < 5);
变量的增量值用作索引,输出将为:
2
3
4
5
考虑到这一点,我们可以采用您的示例行a[k++] = (a[j] < b[i]) ? a[j++] : b[i++]
,并将其读取为含义:
Assign value to a[k], then increment k.
Value is conditionally determined based on:
(a[j] < b[i])
If true, value is:
Read a[j], then increment j.
If false, value is:
Read b[i], then increment i.
,如果您知道如何正确使用它,它可能是一个有用的节省时间,但是如果不正确地使用它也会使得更难解析。