插入排序 Insertion Sort
阿新 • • 發佈:2018-12-06
設 待排序陣列長度為10
a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] | a[9] |
將陣列從小到大排序。
像打撲克時,對撲克牌排序一樣,
手裡已有的牌已完成從小到大排序(手裡只有一張牌,也為有序)
對於新取到的牌,與已有的牌從右至左依次對比並根據大小交換,無需交換時,取下一張牌。
public static void InsertSort(int [] data){ for (int i=1;i<data.length;i++){ // 從第data[1]開始取牌,取到data[9]。 //將取到的牌依次與已有的牌從右向左對比,比取到的牌大,就交換位置;比取到的牌小停止。 for (int j=i;j>0 && data[j-1]>data[j];j--){ int temp; temp = data[j]; data[j]=data[j-1]; data[j-1]=temp; } } } ///////////////////////////////////////////////////////////////////////////////////// //上面的程式插入時(第二個for迴圈),總是在執行對比後插入,對比後插入,比較費時 //下面的程式把手裡已有的牌與取到的牌對比,最後再插入取到的牌 public static void InsertSort(int [] data){ for (int i=1;i<data.length;i++){ // 從第data[1]開始取牌,取到data[9]。 //先設定一個臨時變數儲存要插入的撲克牌 int temp = data[i]; //從取到的data[i]位置開始 int j=i; //將取到的牌依次與已有的牌從右向左對比,比取到的牌temp=data[i]大,就將已有的牌往右移;比取到的牌小時停止。 for (;j>0 && data[j-1]>temp;j--){ data[j]= data[j-1]; } //把取到的牌temp插入 data[j]=temp; } }
3 | 0 | 1 | 8 | 7 | 2 | 5 | 4 | 9 | 6 |
手裡只有一張【3】時,也為有序的撲克牌
3 | 0 | 1 | 8 | 7 | 2 | 5 | 4 | 9 | 6 |
【0】----->【3】
0 | 3 | 1 | 8 | 7 | 2 | 5 | 4 | 9 | 6 |
【1】----->【3】----->【1】
0 | 1 | 3 | 8 | 7 | 2 | 5 | 4 | 9 | 6 |
【8】----->【3】
0 | 1 | 3 | 8 | 7 | 2 | 5 | 4 | 9 | 6 |
【7】----->【8】----->【3】
0 | 1 | 3 | 7 | 8 | 2 | 5 | 4 | 9 | 6 |
【2】----->【8】----->【7】----->【3】----->【1】
0 | 1 | 2 | 3 | 7 | 8 | 5 | 4 | 9 | 6 |
【5】----->【8】----->【7】----->【3】
0 | 1 | 2 | 3 | 5 | 7 | 8 | 4 | 9 | 6 |
【4】----->【8】----->【7】----->【4】----->【3】
0 | 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 | 6 |
【9】----->【8】
0 | 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 | 6 |
【6】----->【9】----->【8】----->【7】----->【5】
0 |
下面為插入排序演算法舞蹈
https://v.youku.com/v_show/id_XMTY0NjQ2ODY5Ng==.html?spm=a2h0j.11185381.listitem_page1.5!25~A