這個過程,也是一個自我提高的過程。
我開始自已寫,while(in > 0 && a[in - 1] >= temp )這裡總有問題。
後來仔細想想,也是,如果IN>0放在後面,那麼&&之後可能會邏輯短路。且IN-1先執行,再判斷IN,就會出現陣列下標IN-1等於-1越界的情況。所以,IN>0必放前面。
第二,將&&更換成&行不行?也不行。因為&不會邏輯短路,就算IN>0不成立,它一樣會執行IN-1的陣列下標判斷,一定會出錯。
真的是一步一小心呀。在規則內,可以橫行,但稍稍越出規則一步,都是不允許的。
public void insertionSort() { int out; int in; for(out = 1; out < nElems; out++){ long temp = a[out]; in = out; System.out.print(a[in] + " \tbefor sort :\t"+ in); while(in > 0 && a[in - 1] >= temp ) { a[in] = a[in -1]; in--; } System.out.println("\t---after sort : \t" + in); a[in] = temp; } }
為了仔細看到對IN位置的查詢,我加了兩個輸出,更能理解程式碼的執行邏輯過程。