知識點9:常見的排序算法–插入排序

插入排序的原理

我們在打撲克的時候,有沒有在拿到牌後都重新整理一遍,方便自己打牌和出牌?我想會有吧。那麼你們整理牌的方式是什麼樣的呢?我想應該都是把大的牌一張一張的往左邊挪,直到所有的牌都從大到小排列吧。是的不管你們是不是這樣,反正我的是這樣~~。那麼,你們比較大小的方式是什麼呢?有人可能就說:那肯定是看牌在哪兩個數字之間,直接插入進去,如果是最大的,就放左邊啊。如果是這樣,恭喜你,初步掌握了插入排序的基礎。爲什麼是初步,而又是基礎呢?這是因爲你這還不是插入排序的思路,只是接近了而已。那麼,什麼纔是插入排序的思路呢?別急,好戲後頭,我們一起來揭曉吧!
好,插入排序法的整牌方式還有1分鐘到達戰場。
你已獲得一副好牌,請從小到大進行整理(就喜歡不按常理整牌):
首先,把整理牌的過程看作一個循環,你有n張牌,就循環n-1遍。起步是第1張牌,終點是第n-1張牌
其次,假設你目前第n張牌,那麼以第n張牌爲範圍,再進行一次循環。起點是n,終點是0
然後,我們以第n張牌進行比較,如果arr[1]小於arr[0],那麼我們交換兩者,然後從n-1起步,與n-2進行比較。直到arr[n-1]大於 arr[n-2],則推出循環,此時已經成排序
最後,沒了~
看不懂,不怕,帶着描述看代碼最容易讓人懂了

插入排序思路的實現

void insertSort(int[] arr){

    int length =arr.length;
    int nextIndex;
    int compareIndex;
    if(length>1){
        for(nextIndex = 1;nextIndex<length;nextIndex++){
            for(compareIndex=nextIndex;compareIndex>0;compareIndex--){
                if(arr[compareIndex]<arr[compareIndex-1){
                    int temp = arr[compareIndex];
                    arr[compareIndex] = arr[compareIndex-1];
                    arr[compareIndex-1] = temp;
                    }
                }else{
                        break;              
                }
            }
        }
    }

好了,看到這裏,一個簡單的思路實現就已經結束了。不知道大家對照着代碼和前面的思路能不能對插入排序有所理解呢?如果沒有,請多看幾遍,建議畫一下每一步的流程圖來方便理解。
當然,以上代碼還可以再次優化的,只是優化的地方在於美觀。我們發現,我們在循環裏面又用了一次的判斷,但這個判斷的實際意義不大,因此我們把他簡化一下~

void insertSort(int[] arr){

    int length =arr.length;
    int nextIndex;
    int compareIndex;
    if(length>1){
        for(nextIndex = 1;nextIndex<length;nextIndex++){
            for(compareIndex=nextIndex;compareIndex>0&&arr[compareIndex]<arr[compareIndex-1]?1:0;compareIndex--){
                    int temp = arr[compareIndex];
                    arr[compareIndex] = arr[compareIndex-1];
                    arr[compareIndex-1] = temp;
                    }
            }
        }
    }

好啦,插入排序就介紹到這裏,如果有疑問,歡迎評論指出,共同探討~
下一章:常見的排序算法 ——希爾排序,敬請期待~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章