插入排序:排序過的資料能顯著改善程式執行速度
1.概述
排序過的資料能顯著地改變程式的執行速度,因而在電腦科學中排序演算法是一類比較特別的東西。舉個例子,我們在有序連結串列中的搜尋要快於在無序連結串列中。
有兩種主要的排序方法——基於元素比較的方法與不基於元素比較的方法。在基於元素比較的方法中,最典型的就是插入排序。插入排序非常簡單,而且易於實現,但是遺憾的是,與其他諸如快速排序、歸併排序等排序演算法相比,它不是很有效。事實上,插入排序對那些元素不超過20個的小資料集來說還是很有用的。
插入排序是一種非常直觀的排序方法,我們大家玩撲克的時候就經常用到。玩家拿到一組無序的牌之後就會自然地開始對其排序。先取一張牌,通過若干次比較,然後將這張牌放到合適的位置上。
現在假設我們有一組資料。第一步剛開始時,該陣列中的資料是無序的,但是我們可以把這個陣列分成兩個部分:已排序的和未排序的,由於是剛開始排序,所以已排序的部分中僅有的一個元素就是陣列的第一個元素,陣列中的其餘元素均在未排序部分。如果陣列的長度是n,那麼該演算法會在接下來的(n-1)步內完成。在接下來的每一步,已排序的部分都會新增一個元素。在每一步中,演算法都會取出未排序部分的第一個元素,將該元素與已排序部分的元素進行若干次比較,然後插入已排序部分中合適的地方,如下圖所示:
插入操作本身是有技巧的。我們在已排序部分從後往前遍歷元素,一旦找到比要插入元素更小的元素或者已經遍歷到了陣列的最前端,那麼我就可以那裡插入元素了,如下圖所示:
2.實現
這裡是用PHP對插入排序的快速實現。插入排序的好處是易於實現,壞處是速度慢且對大資料集無效。
$data = array(4, 2, 4, 1, 2, 6, 8, 19, 3);
function insertion_sort(&$arr){
$len = count($arr);
for ($i = 1; $i < $len; $i++) {
$tmp = $arr[$i];
$j = $i;
while (($j >= 0) && ($arr[$j-1] > $tmp)) {
$arr[$j] = $arr[$j-1];
$j--;
}
$arr[$j] = $tmp;
}
}
為了減少一些元素比較的次數,我們可以使用一個哨兵來稍微提高一點程式碼的效率,就像順序搜尋一樣。
$data = array(4, 2, 4, 1, 2, 6, 8, 19, 3);
function insertion_sort_sentinel(&$arr){
$len = count($arr);
array_unshift(&$arr, -1); //新增哨兵
for ($i = 1; $i < $len+1; $i++) {
$tmp = $arr[$i];
$j = $i;
while ($arr[$j-1] > $tmp) {
$arr[$j] = $arr[$j-1];
$j--;
}
$arr[$j] = $tmp;
}
array_shift(&$arr); // 移除哨兵
}
由於我們是在已排序的部分進行搜尋,很明顯可以用二分查詢法來提高上面演算法效能。但遺憾的是,這樣做並不能很明顯地提高插入排序演算法的總體效率。
3.複雜度
正如我前面所說,該演算法並非很有效。它的複雜度是, 遠遠壞於複雜度為的快速排序,如下圖所示:
4.應用
插入排序對小資料集是很有效的。即使插入排序並非是最有效的排序演算法,但是它也很有用,原因有如下三點:首先,該演算法易於實現;其次,它不需要額外的記憶體空間;最後,如果要排序的資料中大多數是有序的,那麼插入排序將會非常快,效率會非常高。
原文連結:Computer Algorithms: Insertion Sort
歡迎參加iTran樂譯4期
相關文章
- 複習資料結構:排序(一)——插入排序資料結構排序
- 三種插入排序 直接插入排序,折半插入排序,希爾排序排序
- 資料結構--排序--插入排序--python語言描述資料結構排序Python
- 插入排序排序排序
- 【資料結構】直接插入排序資料結構排序
- [java]插入排序及折半插入排序Java排序
- 排序之插入排序排序
- 插入排序排序
- 數的插入排序排序
- 資料結構學習(C++)續——排序【2】插入排序 (轉)資料結構C++排序
- 資料結構&演算法實踐—插入排序資料結構演算法排序
- 【資料結構】直接插入排序_哨兵位資料結構排序
- 04資料結構排序演算法之直接插入排序資料結構排序演算法
- 排序(1)--插入排序和交換排序排序
- 03 插入排序排序
- SOS?求教執行CMP之create,能正常執行,但資料庫中無資料資料庫
- 希爾排序使用直接插入排序、二分插入排序的C++程式碼實現演算法排序C++演算法
- 排序專題 -- (1)插入排序排序
- 選擇排序和插入排序排序
- 排序演算法——插入排序排序演算法
- 【排序】插入類排序—(折半)插入排序、希爾排序排序
- JVM的特性,透過程式碼來揭秘執行時資料區JVM
- python插入排序Python排序
- 插入排序(PHP,C)排序PHP
- php插入排序,快速排序,歸併排序,堆排序PHP排序
- 雙連結串列插入排序例項程式碼排序
- 重學資料結構和演算法(四)之氣泡排序、插入排序、選擇排序資料結構演算法排序
- 排序演算法__折半插入排序排序演算法
- 查詢與排序04,插入排序排序
- 氣泡排序 插入排序 快排排序
- python演算法與資料結構-插入排序(34)Python演算法資料結構排序
- (一)氣泡排序、選擇排序、插入排序排序
- 資料顯示62%的網站仍然執行PHP 5網站PHP
- 排序演算法 - 快速插入排序和希爾排序排序演算法
- PHP 排序演算法之插入排序PHP排序演算法
- 排序演算法之折半插入排序排序演算法
- 圖解選擇排序與插入排序圖解排序
- 連結串列-插入排序排序