白話排序算法--插入排序


前言:

  昨天下午寫好了冒泡排序后,緊跟其后,今天跟新上插入排序算法。

插入排序:它的工作原理是通過構建有序序列,對於未排序數據,在已排序序列中從后向前掃描,找到相應位置並插入

情景描述:

  緊接冒泡排序,每次同學們都屢試不爽,但是學生越來越多了,老師發現每次排完隊,就耽擱了大半節課時了,說道:“咱不用冒泡了,有點OUT了,今天來插入排序”。這時體育老師擔任起了數學老師的職責,又給同學們講了種排隊方式--插入排序。

  1. 開始以第一位同學為基准,由第二個同學開始向前和第一位同學比較,個頭高了不動,低了換位
  2. 第三個同學要先和自己前面的第二位同學比較,如果低了,和第二換位,然后再向前和第一比較,低了再換,否則阻斷,不再比較
  3. 從前往后依次執行步驟2,依次出來一位同學,每次和自己前面的同學進行比較,找到一個合適位置插入,其余學生后移

合適位置:前一位同學等於或低於自己身高,並且后一位同學高於自己身高

  按照這個方式,同學們一個個依次找准位置,再也不用每次相鄰的都比較,而且找到位置后就不必再往前面比較了......


  上圖中,深色部分為每次已排完序的列表,紅色指引末端為要插入元素,其余枝節為即將與之一一比較的元素。


代碼片段:

 

/**
     * 插入排序,默認第一位已經排好序,從第二位開始依次向前比較,確定自己的位置后插入,即前一位小余或等於當前,且后一位大於當前。
     * 插入后,自己新位置后面的元素依次向后移位, 完成一輪插入排序
     * @param arr
     * @return
     */
    public static int[] insertSort(int[] arr) {
        int len = arr.length;
        for (int i = 1; i < len; i++) {
            if (arr[i - 1] > arr[i]) {
                int k = arr[i];
                int j = i;
                while (j > 0 && arr[j - 1] > k) {
                    arr[j] = arr[j - 1];
                    j--;
                }
                arr[j] = k;
            }
        }
        return arr;
    }

 


優點:容易實現,它借助了"逐步擴大成果"的思想,使有序列表的長度逐漸增加。

缺點:穩定性依據元素的值本身而定,且效率不高

 

 

                          

                              寫作不易,難免有疏漏和錯誤,還請慷慨指正,不錯請推薦

  ps:歡迎轉載,轉載請注明出處:http://www.cnblogs.com/liuyitian/p/4054437.html


                                       每天多學一點點     代碼少敲一點點   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM