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