1. 程式人生 > 其它 >PHP資料結構(十八) ——直接插入排序

PHP資料結構(十八) ——直接插入排序

PHP資料結構(十八)——直接插入排序

(原創內容,轉載請註明來源,謝謝)

一、概述

插入排序分為直接插入排序、其他插入排序、希爾排序。其他插入排序又分為折半插入排序、2-路插入排序。

二、直接插入排序

直接插入排序是一種最簡單的排序方法,時間複雜度O(n2),實現方式是將一個記錄插入到已經排序好的有序表,得到一個新的、記錄數增加1的有序表。

插入排序的核心思想,即假設原陣列的第0位至第i-1位都是有序排列的(如從小到大),當第i位出現順序錯誤(如第i位的值小於第i-1位),則需要進行插入排序。

1、演算法

直接插入排序經過以下幾步:

1)按照待排序陣列的順序,從第二個數字開始,逐個數字與前一個數字進行比較。

2)假設當前的比較是從小到大的排序,陣列arr。當arr[i]>=arr[i-1]時,第i個元素保持原位,對i+1進行比較。

3)當arr[i]<arr[i-1]時,則需要進行插入排序。方法是將arr[i]拎出來,從i-1直至0位置的值,逐個進行比較,當比較到第k位,arr[k]<arr[i]時,將arr[k+1]至arr[i-1]的至分別往後挪一位,挪到arr[k+2]至arr[i]的位置,然後將原來的arr[i]的值插入至arr[k+1]處。再繼續往後進行比較。

4)直至遍歷完所有的節點,插入排序結束,所得的陣列即排序好的陣列。

5)當需要從大到小排序時,結果相似,不贅述。

2、關鍵程式碼實現如下

         //直接插入排序
         publicfunction directInsertSort(array $arr = array()){
                   //如果沒有輸入,則拿預設的值比較
                   if(empty($arr)){
                            $arr= $this->arr;
                   }
                   //如果陣列為空或者只有一個元素,直接返回原陣列
                   if(null== $arr || 1 >= count($arr)){
                            return$arr;
                   }
                   //0...i-1都是有序的,此時插入第i個值
                   for($i=1;$i<count($arr);$i++){
                            //當第i個小於第i-1個時,需要進行插入排序,否則迴圈下一個數
                            if($arr[$i]< $arr[$i-1]){
                                     //把第i個值往前挪到x位置,保證arr[x-1]<=arr[i],arr[x+1]>arr[i]
                                     $tmp= $arr[$i];
                                      for($j=$i-1;$j>=0&&$arr[$j]>$tmp;$j--){
                                               $arr[$j+1]= $arr[$j];//所有元素往後挪一位
                                     }
                                     //第j+1位賦值留給原來的第i位
                                     $arr[$j+1]= $tmp;
                            }
                   }
                   return$arr;
         }

注:此程式碼為實現直接插入排序的核心程式碼,程式碼的方法寫在類中,待全部排序都寫完後會有完整版的程式碼

——written by linhxx 2017.07.16

相關閱讀:

PHP資料結構(十七) ——內部排序綜述

PHP資料結構(十六) ——B樹

PHP資料結構(十五) ——雜湊表​

PHP資料結構(十四) ——鍵樹(雙鏈樹)

PHP資料結構(十三) ——動態查詢表(二叉排序樹)

PHP資料結構(十二) ——靜態查詢表​

PHP資料結構(十一) ——圖的連通性問題與最小生成樹演算法(2)

PHP資料結構(十一) ——圖的連通性問題與最小生成樹演算法(1)

PHP資料結構(十) ——有向無環圖與拓撲演算法

PHP資料結構(九) ——圖的定義、儲存與兩種方式遍歷

PHP資料結構(八) ——赫夫曼樹實現字串編解碼(實踐2)

PHP資料結構(八) ——赫夫曼樹實現字串編解碼(實踐1)

PHP資料結構(八) ——赫夫曼樹實現字串編解碼(理論)

PHP資料結構(七) ——串與實現KMP演算法

PHP資料結構(六) ——樹與二叉樹之概念及儲存結構

PHP資料結構(六) ——陣列的相乘、廣義表

PHP資料結構(五) ——陣列的壓縮與轉置

PHP資料結構(四) ——佇列

PHP資料結構(三)——運用棧實現括號匹配

PHP資料結構(二)——鏈式結構線性表

PHP資料結構(一)——順序結構線性表