重溫算法之插入排序法

插入排序原理 通過構建有序序列,對于未排序數據,在已排序序列中從后向前掃描,找到相應的位置并插入。

插入排序非常類似于整撲克牌。
在開始摸牌時,左手是空的,牌面朝下放在桌上。接著,一次從桌上摸起一張牌,并將它插入到左手一把牌中的正確位置上。為了找到這張牌的正確位置,要將它與手中已有的牌從右到左地進行比較。無論什么時候,左手中的牌都是排好序的。

算法的基本思想 假定n是數組的長度,首先假設第一個元素被放置在正確的位置上,這樣僅需從1-n-1范圍內對剩余元素進行排序。對于每次遍歷,從0-i-1范圍內的元素已經被排好序,
每次遍歷的任務是:通過掃描前面已排序的子列表,將位置i處的元素定位到從0到i的子列表之內的正確的位置上。
將arr[i]復制為一個名為target的臨時元素。向下掃描列表,比較這個目標值target與arr[i-1]、arr[i-2]的大小,依次類推。
這個比較過程在小于或等于目標值的第一個元素(arr[j])處停止,或者在列表開始處停止(j=0)。
在arr[i]小于前面任何已排序元素時,后一個條件(j=0)為真,
因此,這個元素會占用新排序子列表的第一個位置。
在掃描期間,大于目標值target的每個元素都會向右滑動一個位置(arr[j]=arr[j-1])。
一旦確定了正確位置j,目標值target(即原始的arr[i])就會被復制到這個位置。
與選擇排序不同的是,插入排序將數據向右滑動,并且不會執行交換。

代碼實例

  public class InsertSort {
  public static void main(String[] args) {
    int[] array = { 10, 20, 11, 5, 32, 44, 7, 9 };
    int j;
    int target;
    for (int i = 1; i < array.length; i++) {
        j = i;
        target = array[i];
        while (j > 0 && target < array[j - 1]) {
            array[j] = array[j - 1];
            j--;

        }
        array[j] = target;
        
    }
    for (int num : array) {
        System.out.print(num + " ");
    }
}
}
}

運行結果

46.png

插入排序的時間復雜度:
空間復雜度O(1)
時間復雜度O(n2)
最差情況:反序,需要移動n*(n-1)/2個元素
最好情況:正序,不需要移動元素
數組在已排序或者是“近似排序”時,插入排序效率的最好情況運行時間為O(n);
插入排序最壞情況運行時間和平均情況運行時間都為O(n2)。
通常,插入排序呈現出二次排序算法中的最佳性能。
對于具有較少元素(如n<=15)的列表來說,二次算法十分有效。
在列表已被排序時,插入排序是線性算法O(n)。
在列表“近似排序”時,插入排序仍然是線性算法。
在列表的許多元素已位于正確的位置上時,就會出現“近似排序”的條件。
通過使用O(nlog2n)效率的算法(如快速排序)對數組進行部分排序,
然后再進行選擇排序,某些高級的排序算法就是這樣實現的。

文章摘自:http://www.cnblogs.com/xiaoming0601/p/5862793.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 某次二面時,面試官問起Js排序問題,吾絞盡腦汁回答了幾種,深感算法有很大的問題,所以總計一下! 排序算法說明 (1...
    流浪的先知閱讀 1,208評論 0 4
  • Ba la la la ~ 讀者朋友們,你們好啊,又到了冷鋒時間,話不多說,發車! 1.冒泡排序(Bub...
    王飽飽閱讀 1,815評論 0 7
  • 概述 排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部...
    蟻前閱讀 5,220評論 0 52
  • 概述:排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,743評論 0 15
  • 課程改了,只上下午,基本都跟得上了。 現在最主要的是基本功,就看課下我自己的了。 每天都在想著怎么放棄,真的很嚇人...
    安一destiny閱讀 269評論 0 0