算法系列: 10大常見排序算法(3)插入排序

2021-03-02 中學生編程與信息學競賽自學

本課程是從少年編程網轉載的課程,目標是向中學生詳細介紹計算機比賽涉及的程式語言,數據結構和算法。編程學習最好使用計算機,請登陸 www.3dian14.org (免費註冊,免費學習)。

插入排序的基本操作就是將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據

算法介紹

插入排序最好的示例是撲克牌,很多書都以抓撲克牌的過程為例子講述插入的排序過程。

現在你需要將手牌從左到右按小到大排序。

從最左邊開始排序,最左邊1張牌是紅桃6,顯然對於1張牌而言可以看作是已經排好序(有序)的。

現在看第2張牌。

第2張牌和(已經排好序的)第1張比較, 插入到正確的位置

接下來看第3張牌。

第3張牌紅桃3依次與左邊的牌比較,找到正確的位置插入

 接下來看第4張牌。

第4張牌紅桃8依次與左邊的牌比較,找到正確的位置插入




接下來看最後一張牌。

最後一張牌紅桃A依次與左邊的牌比較,找到正確的位置插入。

到這裡,排序大功告成~

動畫演示

(from Wikipedia)

算法核心思想

算法實現

沒代碼的算法都是耍流氓

顯然我們需要一個變量i來記錄每次掃描未排序部分的開頭位置。

問題終於來了。。。

答案是A。 交換2個變量值的代碼前面已經見過,就不介紹了。

和選擇排序法的比較

插入排序法和選擇排序法接近。在選擇排序法中,經過k次掃描(整個)數組,最初的k個元素完成排序。

 想一想:

再想一想

不過插入排序法和選擇排序法比較,也有自身的代價:

在插入排序法中插入一個元素到已經排好序部分,該部分後右側元素都需要右移(寫操作);而選擇排序法中每次只需要交換一對元素。

當寫操作的成本遠遠高於讀操作時,選擇排序法更優一些。

算法複雜度

讓我們考慮最好情況,最差情況, 和一般情況

最好情況 :最好情況是數組元素已經排好序啦

During each iteration, the first remaining element of the input is only compared with the right-most element of the sorted subsection of the array.

Comparison/比較次數:Cmin=n-1

Move/移動次數:Mmin=0

最差情況 : 是排好了,不過方向反了(逆序)

in these cases every iteration of the inner loop will scan and shift the entire sorted subsection 。在最壞情況下,每次都需要走過全部已經排序部分

Comparison/比較次數:Cmax=1+2+3+4+……+n-1=(n-1)n/2

Move/移動次數:Mmax=1+2+3+……+n-1=(n-1)n/2

一般情況 : 我們用最好和最差的平均值來做粗略估計

我們做個粗略的估算,取最好情況和最壞情況的平均值來表示一般情況。在一般情況下的關鍵字比較次數和對象移動次數約為 n^2/4。因此,直接插入排序的時間複雜度為 O(n^2)

思維導圖系列: 10大最常見排序算法

算法系列: 10大常見排序算法(1) 冒泡

算法系列: 10大常見排序算法(2) 選擇排序

請點擊閱讀原文來觀看動畫交互課件

註:部分圖片原型來自網絡。

相關焦點

  • 算法系列: 10大常見排序算法: 快速排序法
    快速排序法(Quick Sort)是劍橋大學教授在讀大學時發明的排序算法,也是當今使用最廣泛的高效排序算法之一。QuickSort思路直觀而精巧,值得我們反覆吟唱對於序列中的一個數, 如果:這個數前面的所有數都不比它大這個數後面的所有數都不比它小那麼: 這個數已經放在從小到大的升序數列中的最終的正確位置了。快速排序法就是用這個直觀的事實來給數組中的每一個數字排序。
  • 排序算法之插入排序
    排序算法在編程領域中起著舉足輕重的作用,在目標檢索、機器學習、數值計算、圖像處理等領域有著廣泛地應用。為了追本溯源,公眾號特推出常用經典排序算法系列推文,讓小夥伴們深入了解排序算法的實現原理,同時也提升matlab編程能力。
  • 排序算法專題之插入排序
    經典插入排序例題1.使用插入排序算法對列表a升序排序。函數名:insert_sort(a)參數表:a -- 待排序列表。返回值:該方法沒有返回值,但是會對列表的對象進行升序排序。算法思想:外層循環控制待排序數組的左邊界,即a[i:]為待排序部分;內層循環掃描a[:i],將元素a[i]插入到適當位置def insert_sort (a):    for i in range(1, len(a)):        t, j =  ①                           while j >
  • 插入排序算法,就這麼簡單
    資料地址:https://en.wikipedia.org/wiki/External_sorting上一篇《程序兵法:Java String 源碼的排序算法(一)》,講到了 java.lang.Comparable 接口。那麼接口是一個抽象類型,是抽象方法(compareTo)的集合,用 interface 來聲明。
  • 算法一看就懂之「 插入排序 」
    第二遍循環時,從「未排序」的區段中拿出元素6,它比「已經排序」段中的元素3大、比元素8小,因此元素3不動,只需要將元素8向後移動一位,留出空位讓元素6插入,這次移動次數也為1次。第三遍循環時,從「未排序」的區段中拿出元素2,它比「已經排序」段中的元素2小,因此需要將元素3、元素6、元素8均向後移動一位,留出空位讓元素2插入,這次移動次數為3次。
  • 排序算法問題:穩定排序與不穩定排序
    /archive/2012/10/21/2732980.html前言排序算法的穩定與不穩定究竟是指的什麼?  作為在面試中經常被考到的考點,每一個程式設計師都應該知道,本文總結了常見算法的穩定性,值得一看,希望能對大家有所幫助。
  • 力扣(LeetCode)- 常見的排序算法總結
    插入排序比冒泡排序哪個好?插入排序好。[j+1] =a[j]; }插入排序比冒泡排序有更多的優化空間,比如希爾排序。3. 常見的排序算法總結4. 排序算法原理描述冒泡排序移動相鄰位置的兩個數據,重複執行。
  • Python中的插入排序算法,插入排序的優缺點,中級python技術點
    像冒泡排序一樣,插入排序算法也易於實現和理解。但是與冒泡排序不同,它通過將每個項目與列表的其餘部分進行比較並將其插入正確的位置,來一次構建一個列表。此「插入」過程為算法命名。一個很好的類比來解釋插入排序是您對一副紙牌進行排序的方式。想像一下,您手裡拿著一組卡片,並且想要按順序排列它們。首先,將一張卡片與其餘卡片進行逐步比較,直到找到正確的位置為止。
  • 數據結構常見的八大排序算法
    八大排序,三大查找是《數據結構》當中非常基礎的知識點,在這裡為了複習順帶總結了一下常見的八種排序算法。
  • C語言插入排序算法及代碼
    插入排序是排序算法的一種,它不改變原有的序列(數組),而是創建一個新的序列,在新序列上進行操作。這裡以從小到大排序為例進行講解。基本思想及舉例說明插入排序的基本思想是,將元素逐個添加到已經排序好的數組中去,同時要求,插入的元素必須在正確的位置,這樣原來排序好的數組是仍然有序的。
  • 排序算法
    數據結構中的幾種排序算法:插入排序分為直接插入排序和希爾排序。
  • 一文圖解 Java 源碼的插入排序算法
    算法性能用大 O 標記法表示。大 O 標記法是標記相對增長率,精度是粗糙的。比如 2N 和 3N + 2 ,都是 O(N)。也就是常說的線性增長,還有常說的指數增長等典型的增長率因此被排序的對象屬於 Comparable 類型,即實現 Comparable 接口,然後調用對象實現的 compareTo 方法進行比較後排序。在這些條件下的排序,叫作基於比較的排序(comparison-based sorting)三、插入排序白話文:熊大(一)、熊二、熊三... 按照身高從低到高排隊(排序)。這時候熊 N 加入隊伍,它從隊伍尾巴開始比較。
  • JavaScript實現排序算法
    一、大O表示法大O表示法:在計算機中採用粗略的度量來描述計算機算法的效率,這種方法被稱為「大O」表示法在數據項個數發生改變時,算法的效率也會跟著改變。所以說算法A比算法B快兩倍,這樣的比較是沒有意義的。因此我們通常使用算法的速度隨著數據量的變化會如何變化的方式來表示算法的效率,大O表示法就是方式之一。
  • JS家的排序算法 十大經典算法排序總結
    然而,在傳統的計算機算法和數據結構領域,大多數專業教材和書籍的默認語言都是Java或者C/C+ +。這給最近想惡補算法和數據結構知識的我造成了一定困擾,因為我想尋找一本以JavaScript為默認語言的算法書籍。當我了解到O』REILLY家的動物叢書系列裡有一本叫做《數據結構與算法JavaScript描述》時,便興奮的花了兩天時間把這本書從頭到尾讀了一遍。
  • 十大經典排序算法之希爾排序算法
    希爾排序之前我們講過冒泡排序、選擇排序、插入排序,它們的時間複雜度都是 今天我們要講的希爾排序雖然也是插入排序的一種,但是它是插入排序的一個高效變形,脫離了 主要思想希爾排序的思想簡單點說就是有跨度的插入排序,這個跨度會逐漸變小,直到變為 1,變為 1 的時候也就是我們之前講的簡單插入排序了。規範點的描述就是,選擇一組遞減的整數作為增量序列,最小的增量必須為 1。
  • 八十七、Python|十大排序算法系列(上篇)
    只要我在每篇博文中寫得自己體會,修煉身心;在每天的不斷重複學習中,耐住寂寞,練就真功,不畏艱難,奮勇前行,不忘初心,砥礪前行,人生定會有所收穫,不留遺憾 (作者:Runsen )作者介紹:Runsen目前大三下學期,專業化學工程與工藝,大學沉迷日語,Python, Java和一系列數據分析軟體。導致翹課嚴重,專業排名中下。.
  • JavaScript實現的9大排序算法
    1)算法簡介插入排序(Insertion-Sort)的算法描述是一種簡單直觀的排序算法。它的工作原理是通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,通常採用in-place排序(即只需用到O(1)的額外空間的排序),因而在從後向前掃描過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。2)算法描述和實現一般來說,插入排序都採用in-place在數組上實現。
  • 程式設計師必備的幾種常見排序算法和搜索算法總結
    , 但是基礎還是要好好鞏固一下的.本文將以圖文的形式為大家介紹如下算法知識,希望在讀完之後大家能有所收穫:冒泡排序及其優化選擇排序插入排序歸併排序.在真實項目中我們往往不會採用冒泡排序,更多的會用快速排序或者希爾排序.關於排序算法性能問題我在《前端算法系列》如何讓前端代碼速度提高60倍有詳細介紹.
  • Python實現八大經典排序算法
    排序算法可以分為內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸併排序、快速排序、堆排序、基數排序等。
  • 經典排序算法全攻略
    排序算法可以分為內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸併排序、快速排序、堆排序、基數排序等。