在下面的merge-sort算法中,在第3个定义中,第一个while循环是:
a[k++] = (a[j] < b[i]) ? a[j++] : b[i++].
我理解RHS是一个条件语句,声明如果满足第一个操作数,那么我们应该执行第二个操作数,如果不满足,我们应该执行第三个操作数。
a[k++]
,a[j++]
和b[i++]
对应哪个元素?
根据我的理解,它应该意味着在每个连续的while循环中,元素递增。
即。从第一个while循环的初始值(i=1
,j=m+1
,k=1
)开始,下一个while循环将包含(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
答案 0 :(得分:10)
a[k]
获取数组k
的{{1}}元素。
a
会增加k++
的值,但会返回之前的值。
因此,在{/ 1>返回k
的值后,a[k++]
会返回a[k]
,其副作用是增加k
。 a[k]
相当于:
a[k++] = 4
另一方面,a[k] = 4
k = k + 1
会在返回之前增加++k
,因此k
将是
a[++k] = 4
答案 1 :(得分: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.
如果您知道如何正确使用它,它可以节省时间,但如果使用不当,它也会使事情变得更难解析。