php實現插入排序

1.插入排序的概念

它是通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。

其實這個我們並不陌生,舉一個現實中的小例子,我們都打過撲克,拿到牌時,就需要對撲克進行抹順,一般都是按着左右是從小到大的順序,新來了一張牌,我們是不是一張一張的進行比較,找到它合適的位置,這就是插入排序。


2.代碼實現

function InsertSort(&$arr){ //這個是取數組的地址,這樣這個數組的值也能改變
    for ($i=1;$i<count($arr);$i++) {    //從1開始,因爲第0個是有序的
        $target = $arr[$i]; //將目標數用一個變量保存起來
        $j = $i;
        while ($j>0 && $target < $arr[$j-1]) {  //從目標數的前一個開始向前循環,當前數比目標數小,就將當前數向前挪一個,騰出一個位置
            $arr[$j] = $arr[$j-1];
            $j--;
        }
        $arr[$j] = $target; //循環完了,找到了目標數合適的位置,將目標數放到位置上
    }
}
$arr = [12,56,98,32,16,34,2,9,1];
InsertSort($arr);
dump($arr);

上面是相應的代碼,關鍵步驟上有標註。

3.複雜度分析

①先將第一個元素視爲有序,第二個元素與第一個元素比較,若比第一個元素小,則插入到第一個元素之前。第三個元素依次與第二個元素、第一個元素比較(前三 個元素有序);第四個元素依次與第三個、第二個、第一個元素比較,插入到合適位置以形成一個有序表(即此時前四個元素有序)因此,直接插入排序算法是逐步 地形成一個有序序列的。也即在表的前頭形成一個局部有序序列。
②不論初始序列如何,總需要 N-1 趟排序,第一趟是第二個元素與第一個元素比,第二趟是第三個元素與前二個元素比,第三趟是第四個元素與前三個元素比……
③當初始序列有序時,第一趟只需比較一次,第二趟只需比較一次,第三趟也只需比較一次……總共只需比較 N-1 次即可完成排序。當初始序列逆序時,第一趟比較一次,第二趟比較二次,……第 N-1 趟比較 N-1 次。總共比較 n(n-1)/2 次。
④直接插入排列是基於明確的相鄰位置的兩個元素的比較,因此該算法是穩定的。排序過程的比較次數與待排序列的初始狀態有關。每進行一趟排列並不能唯一地確定下一個元素的最終位置。

因此最好的情況是O(n),最壞的情況是O(n2) n的平方。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章