程序猿修仙之路--算法之直接插入排序
==算法主要衡量標準==
-
時間復雜度(運行時間)
在算法時間復雜度維度,我們主要對比較和交換的次數做對比,其他不交換元素的算法,主要會以訪問數組的次數的維度做對比。
其實有很多同學對于算法的時間復雜度有點模糊,分不清什么所謂的 O(n),O(nlogn),O(logn)...等,也許下圖對一些人有一些更直觀的認識。
-
空間復雜度(額外的內存使用)
排序算法的額外內存開銷和運行時間同等重要。 就算一個算法時間復雜度比較優秀,空間復雜度非常差,使用的額外內存非常大,菜菜認為它也算不上一個優秀的算法。
-
結果的正確性
這個指標是菜菜自己加上的,我始終認為一個優秀的算法最終得到的結果必須是正確的。就算一個算法擁有非常優秀的時間和空間復雜度,但是結果不正確,又有什么意義呢?
==原理==
每次在無序的列表中取一個元素插入到一個有序列表的適當位置,成為一個元素加1的新的有序列表。。
插入排序根據原理又分為 直接插入排序、二分插入排序、希爾排序等,今天主要講一下直接插入排序。直接插入排序是一種穩定的排序算法
假設排序順序從左至右,具體步驟如下:
...繼續重復以上過程,直到最后一個元素完成比較
比較移動過程中,如果元素不需要移動意味著該元素排序完畢。
++網絡上的插入排序大多都是新建一個有序列表用來存放最終結果,其實在無序列表上進行排序操作空間復雜度才更優++
也許一張更直觀的圖比上千句話效果都好:
==復雜度==
-
時間復雜度
對于長度為N的主鍵不重復的列表,插入排序 平均情況下需要n2/4次比較,最壞情況下需要n2/2次比較,最好的情況下需要n-1 次比較。
對于長度為N的主鍵不重復的列表,插入排序平均情況下需要n2/4次交換,最壞情況下需要n2/2次交換,最好情況下需要0次交換。
==性能和特點==
總體來說,直接插入排序是一種比較簡單的排序算法,很容易理解也很好用代碼實現,當然他的特點也很明顯:
運行時間和數據初始狀態有關
插入排序的思想是把一個元素插入一個有序的列表中,假如這個元素的位置正好是有序部分的末尾呢?也就是說當前元素不用移動位置。 再一次假如整個列表都是有序的會發生什么情況呢?根本就不需要移動任何元素。這也就是為什么在最好的情況下交換次數為0,比較次數為n-1的原因。
假如列表的很大一部分元素是有序的,插入排序可能比大多數排序算法都要快。
==適用場景==
直接插入排序對于小型列表或者非隨機元素列表很有效。例如:部分元素有序。大體可歸納為:
==其他==
-
為什么插入排序是穩定呢?
插入排序是在一個已經有序的小序列的基礎上,一次插入一個元素。當然,剛開始這個有序的小序列只有1個元素,就是第一個元素。比較是從有序序列的末尾開始,也就是想要插入的元素和已經有序的最大者開始比起,如果比它大則直接插入在其后面,否則一直往前找直到找到它該插入的位置。如果碰見一個和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后順序沒有改變,從原無序序列出去的順序就是排好序后的順序,所以插入排序是穩定的。
==實現案例==
-
c#
運行結果:
原始數據: 72,78,42,60,84,74,60,79,72,52
排序數據: 42,52,60,60,72,72,74,78,79,84
Go
家里沒環境,還得翻墻,以后再補上吧,望見諒。
獨樂不如眾樂
我表弟在追學校的一個女生,每天短信無數,可那妞從來都不回他。我對他說:騷年!女人的天性只是八卦和好奇心!就你這樣還想泡妞呢!看你表哥的!我用他手機給那妞發:你是我們學校三大美女之一,但我只喜歡你。半分鐘之后,那妞就回了:另外兩個是誰,你為什么只喜歡我啊?
添加關注,查看更精美版本,收獲更多精彩
轉載于:https://juejin.im/post/5cafe94b5188251b2f3a521f
總結
以上是生活随笔為你收集整理的程序猿修仙之路--算法之直接插入排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle数据库——SQL高级查询
- 下一篇: PostgreSQL 当有多个索引可选时