1. 程式人生 > >插入排序 Insertion Sort

插入排序 Insertion Sort

設 待排序陣列長度為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