什么是数组在方括号内具有递增元素的含义?

3
在归并排序的以下算法中,在第3个定义中,第一个while循环中有:
a[k++] = (a[j] < b[i]) ? a[j++] : b[i++].

我理解RHS是一个条件语句,它表明如果第一个操作数得到满足,那么我们应该执行第二个操作数,如果没有得到满足,我们就应该执行第三个操作数。

a[k++]a[j++]b[i++]对应哪个元素呢?

根据我的理解,这应该意味着在每个连续的while循环中,元素都会递增。

也就是说,从初始化的值(i=1j=m+1k=1)开始进行第一个while循环,下一个while循环将包括(i=2j=m+2k=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

这个回答解决了你的问题吗?数组内的递增运算符 - GSerg
2个回答

15

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

2
具有增加 k 的副作用,且不会在任何地方引起困惑 :) - lcs
1
“++k”会在返回值之前增加“k”的值。但很抱歉,这可能会导致错误的结论。 “++k”确实会产生比“k”先前值大1的值,并且在下一个序列点之前,“k”的值将增加1——但是这两个增量1可以独立发生。 - Jerry Coffin

0

在数组下标中,增量和减量运算符的工作方式与其他位置相同。后缀版本会增加变量并返回其原始值,而前缀版本会增加变量并返回其新值。

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.

如果你知道如何正确使用它,它可以成为一个有用的时间节省工具,但如果使用不当,它也可能使解析变得更加困难。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接