[數據結構與算法]10 直接插入排序( Java 版)

直接插入排序,當你看到這幾個字的時候,首先第一想法是什麼?

我第一想法是在我鬥地主的時候,比如我的牌是 5,J,K 下一張牌是 8 ,那我就直接把它放在 5 和 J 之間,此時手裏面的牌就是 5,8,J,K 再來一張牌是 4 ,那就放在最前面,此時是 4,5,8,J,K 又來一張牌是 10 ,那就直接把它放在 8 和 J 之間,就是 5,8,10,J,K .(原諒我有點兒強迫症,一定要把牌從大到小碼好才覺得順眼)
發現規律了嘛?在我手裏面的牌是有序的,沒有在我手裏面的牌則是無序的,然後我一張一張的從無序的牌裏面抽出來,然後和我手裏面的牌進行比較,看看抽到的這張牌將它放在哪個位置比較好.
如果找到了合適的位置,就直接插入進去就可以了.
上面的這個過程,就是直接插入排序的體現.

上面的描述比較口語化,咱們用術語來說一下原理(顯得我比較有文化,哈哈哈):

  • 將 n 個待排序的元素看成是一個有序表和無序表
  • 每次從無序表中取出第一個元素,把它插入到有序表的合適位置,使得有序表從整體來看依然有序.
  • 第一趟比較前兩個數,然後把第二個數按照大小插入到有序表中;第二趟將第三個數據與前面兩個數據進行比較,將第三個數據插入到有序表合適的位置中
  • 按照這樣的步驟依次進行下去,進行了 n-1 趟掃描以後,就整個待排序列排好了.

從上面的步驟中,應該能夠體會到,直接插入排序有兩層嵌套循環.
第一層是外循環,標識待比較的數值,也就是從無序表中取出來的那個值.
第二層是內循環,是爲了確定從無序表中取出的值的最終位置.
但是外循環是從第二個數開始比較的,因爲直接插入排序是將待比較的數值與它的前一個數值進行比較,如果沒有前一個數值,也就沒有直接插入排序這一說.

OK ,理論知識補充完畢了,咱們來看看代碼上是如何實現的:

/**
 * 直接插入排序代碼實現
 * @author 鄭璐璐
 * @date 2020-1-25 11:39:13
 */
public class StraightInsert {
    public static void straightInsert(int[] arr){
        // 定義變量
        int i , j , insertNote;
        // 從數組的第二個元素開始循環,將數組中的元素插入
        for (i=1;i<arr.length;i++){
            // 第一次循環,假設第 2 個元素爲要插入的元素
            insertNote = arr[i];
            j = i - 1;
            while (j>=0 && insertNote < arr[j]){
                // 如果要插入的元素小於第 j 個元素,就將第 j 個元素向後移動
                arr[j+1] = arr[j];
                j--;
            }
            // 要插入的元素大於第 j 個元素時,將要插入的數據插入到數組中
            arr[j+1] = insertNote;
        }
    }
    public static void main(String[] args){
        int[] arr ={1,8,95,45,78,56,23,456,741,16};

        straightInsert(arr);

        for (int i : arr) {
            System.out.println(i);
        }
    }
}

以上,就是想要分享的內容啦~
感謝您的閱讀哇
有什麼更好的實現方法更歡迎評論區交流~

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