前言
由於LeetCode上的演算法題很多涉及到一些基礎的資料結構,為了更好的理解後續更新的一些複雜題目的動畫,推出一個新系列 -----《圖解資料結構》,主要使用動畫來描述常見的資料結構和演算法。本系列包括十大排序、堆、佇列、樹、並查集、圖等等大概幾十篇。
你可以關注公眾號 五分鐘學演算法 獲取更多排序內容。
插入排序
插入排序的程式碼實現雖然沒有氣泡排序和選擇排序那麼簡單粗暴,但它的原理應該是最容易理解的了,因為只要打過撲克牌的人都應該能夠秒懂。插入排序是一種最簡單直觀的排序演算法,它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入。
演算法步驟
-
將第一待排序序列第一個元素看做一個有序序列,把第二個元素到最後一個元素當成是未排序序列。
-
從頭到尾依次掃描未排序序列,將掃描到的每個元素插入有序序列的適當位置。(如果待插入的元素與有序序列中的某個元素相等,則將待插入元素插入到相等元素的後面。)。
演算法演示
排序動畫過程解釋
-
一開始左端數字已經排序,數字 5 不動
-
然後,取出剩餘未操作的左端數字 3
-
將其與已經操作的左側數字相比較
-
如果左邊的數字較大,則交換兩個數字
-
這種情況下,由於 5 大於 3 ,所以交換兩個數字
-
重複此操作,直到出現一個較小的數字或者數字到達左端
-
數字 3 已經完成排序
-
接下來,和之前一樣取出剩餘未操作的左端數字 4
-
與其相鄰的左邊數字進行比較
-
這種情況下,由於 5 大於 4 ,所以交換兩個數字
-
繼續操作,由於 3 小於 4 ,即出現了更小的數字,所以 4 停止移動
-
數字 4 已經完成排序
-
重複相同的操作,直到所有的數字完成排序
程式碼實現
為了更好的讓讀者用自己熟悉的程式語言來理解動畫,筆者將貼出多種程式語言的參考程式碼,程式碼全部來源於網上。
C++程式碼實現
Java程式碼實現
Python程式碼實現
JavaScript程式碼實現
如果你是iOS開發者,可以在GitHub上 github.com/MisterBooo/… 獲取更直觀可除錯執行的原始碼。
你可以關注公眾號 五分鐘學演算法 獲取更多排序內容。