6.5.6
Each exchange operation on line 5 of HEAP-INCREASE-KEY typically requires
three assignments. Show how to use the idea of the inner loop of INSERTIONSORTto reduce the three assignments down to just one assignment.
HEAP-INCREASE-KEY.A; i; key/
1 if key < A[i]
2 error “new key is smaller than current key”
3 A[i] = key
4 while i > 1 and A[ PARENT(i) < A[i]
5 exchangeA[i] with A[PARENT(i)]
6 i = PARENT(i)
Analyse
The equivalent of the above procedure is the follows:
There's a array B, now you konw B[i] can be greater than the element before B[i], you're asked to move B[i] to after the first element B[j] where B[j] > B[i].
Solution 1
Just like in heap-increase-key, loop through the array from i, exchange each element greater than the original B[i], which involves 3 assignments for each exchange.
Solution 2
Just loop through the array,
1. find the final position of B[i],
2 record B[i] to temp,
3. move the B[i-1] through B[j] one position ahead,
4. put temp to B[j].
On average, one assignment for each exchange.
Extension
If the order of memcpy satisfies our need, then a single machine instruction will do this stuff.
From http://blog.csdn.net/cheetach119/article/details/9352731