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