PHP資料結構(十八) ——直接插入排序
阿新 • • 發佈:2022-05-03
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
相關閱讀: