数组在方括号中增加元素是什么意思



在以下算法中,在第3个定义中,首先是:

有:
a[k++] = (a[j] < b[i]) ? a[j++] : b[i++].

我知道RHS是一个条件性的说明,说明如果满足了第一操作数,那么我们应该执行第二个操作数,如果不满足,我们应该执行第三个操作数。

a[k++]a[j++]b[i++]对应于什么元素?

从我的理解中,这应该意味着每个连续的循环中,元素会增加。

即。从第一个while loop开始初始化值(i=1j=m+1k=1),下一个while loop将包含( 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

a[k]取用数组ak元素。

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.

,如果您知道如何正确使用它,它可能是一个有用的节省时间,但是如果不正确地使用它也会使得更难解析。

最新更新