8.3 直接插入排序
生活随笔
收集整理的這篇文章主要介紹了
8.3 直接插入排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
就如同拿到一摞亂撲克牌時候要在手里將順序整理好一樣,直接插入排序(Straight Insertion Sort)的基本操作是將一個記錄插入到已經排好序的有序表中,從而得到一個新的、記錄數增1的有序表。
復雜度分析:
從空間來看,它需要一個記錄的輔助空間O(n)(其實不需要也可以,直接在原數組中進行滑動操作,將目前要執行的元素current向前滑動到它對應的位置,此時不需要額外空間即O(1)),因此關鍵是看它的時間復雜度。當最好的情況,也就是要排序的表本身就是有序的,我們就相當于遍歷了一遍數組,只是執行了大循環,內部小循環一直都未進行,而如果是最壞的情況,即排序表示逆序的,此時需要比較的次數就是 n * (n + 1)/2,需要移動的次數也是這些。如果排序記錄是隨機的,那么根據概率性相同的原則,平均比較和移動的次數約為 n * n / 4次。因此我們得出直接插入排序法的時間復雜度為O(n*n)。從這里可以看出,同樣的O(n*n)的時間復雜度,直接插入排序法比冒泡法和簡單選擇排序法的性能要好一些。
下面看一下用php實現的該算法:
<?php header("content-type:text/html;charset=utf-8"); /** 插入法排序:* 每一個位置的值向前滑動,挨個與它之前的值進行比較,插到合適的位置* 時間復雜度:與數據情況有關* 最好的情況:O(N);* 最差的情況:O(N^2)* 額外空間復雜度O(1)* */function insertSort($arr){if($arr == null || count($arr)<2){return true;}for($current=1;$current<count($arr);$current++){ //current為目前要進行插入操作的數字,0位置不需要再插入了,所以從1開始for($i = $current;$i>0 && $arr[$i-1]>$arr[$i];$i--){ //i>0保證往前滑比較的時候不越界,$arr[$i-1]>$arr[$i] 表示要進行插入操作的數字i與它前面的那個數進行比較,//如果比它小就往前滑,所以執行i--,繼續和它前一個數比較,直到插進適合它的位置swap($arr,$i-1,$i);}}return $arr; }function swap(&$arr,$i,$j){ //注意這里引用變量的使用$tem = $arr[$i];$arr[$i] = $arr[$j];$arr[$j] = $tem; }$arr = [2,33,45,22,64,67,12,1,0,9]; $array = insertSort($arr); print_r($array);//結果:Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 9 [4] => 12 [5] => 22 [6] => 33 [7] => 45 [8] => 64 [9] => 67 )?
轉載于:https://www.cnblogs.com/xlzfdddd/p/10475495.html
總結
以上是生活随笔為你收集整理的8.3 直接插入排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dubbo 高危漏洞!原来都是反序列化惹
- 下一篇: 面试官:面对业务量增长10倍、100倍怎