: [, a; |9 ?* H/ f$ t 可以看出,直接插入排序不可能只有一轮,像前面讲的过程就是一轮的过程,结果就是把未排序序列的首元素插入到了已排序序列中并保持原来的顺序,正如把刚摸到的一张牌按顺序插入到你的手牌中。实际上,一开始序列是全部未排序的,我们可以把第一个元素作为已排序元素,也就是说已排序序列一开始只有一个元素,end值就为0,后面的元素就全部都是未排序序列的了。8 n' I. {0 t# e
/ ^/ m: P# R' P" w+ M . ]6 J j) D( b ( q5 a- n) }0 P$ ?. K 也就是说要将整个原序列排好序的话要让已排序序列拓展至整个原序列,也就是end要不断增加到size - 1(size是数组元素个数),end值为size - 1时结束,所以还要外套一个循环。 9 J8 h1 t& g, \4 ? 9 ^+ X) U' J+ s6 }" g. V0 I3 svoid InsertSort(int* arr, int sz)! v( M: M) A) T! \1 n! Y8 t
{! B4 g- X' z4 \7 o, V
assert(arr);5 l, T d6 c0 S! z! d6 h
8 m. x9 q0 z% o- Z7 Z( e5 {! l! P1 l
for (int i = 0; i < sz - 1; ++i)//i的取值就是end的取值,end最多取到sz-2算有效,当它取到sz-1时就该结束循环了) a, p- S4 \6 e8 L
{& }& c2 C$ s0 J: C2 m0 h
//单轮排序 a2 H0 H7 m7 s/ `; X, b" W5 c
int end = i;; V9 x7 T) e$ j2 N, M3 p- S
int tmp = arr[end + 1];: n5 b. y. `0 D2 \
while (end >= 0)//为什么要>=0呢?可不可以>0?$ _7 c: ]4 t3 [: X3 ^6 A$ L
{ 2 w, p$ w5 S6 w. T7 [" Y+ P Q //要排升序 . A e/ u2 y( ^ _9 [4 H( N$ \- ^7 {
if (tmp < arr[end]): N4 \. B s6 J1 F) \. P w
{ v+ Y8 ?8 Z; G9 C
arr[end + 1] = arr[end]; 3 Z- ?' W2 u: Z9 Z. ^ --end; " o( d) x( F3 @8 j* m, C } . {5 A" e, D6 L0 i, b else; C, @* }, p' [8 B/ N% k
{ - |: j, I- z# Z% i, A! V! | break; 0 `* A( d- B6 @, `2 L( j H } 8 b) }# ?+ f) J" z, I: `& J. D }* J$ Y: R, t7 x/ {8 U- `1 ~
arr[end + 1] = tmp; * v4 J) i( R( Y/ d% f } 9 T/ }- j! Y0 t}! t/ r5 k8 Y# P/ B% [