如何實現插入排序

  • 描述: 插入排序的基本思想就是 對於給定的一組記錄,初始時假設第一個記錄自成一個有序序列,其餘的記錄爲無序序列。
  • 接着從第二個記錄開始,按照記錄的大小依次將當前處理的記錄插入到其之前的有序序列中,直至最後一個記錄插入到有序序列中爲止。
  • 比如:
  • 數組 array(2,5,1,3)
  • 第一步插入 2 以後: [2] 5 1 3
  • 第二步插入 5 以後: [2 5] 1 3
  • 第三步插入 1 以後: [1 2 5] 3
  • …]
header("Content-type:text/html;charset=utf-8");
function insertSort($arr){
    //已經間接將數組分成2部分,下標小於當前的(左邊的)是排序好的序列
    $len = count($arr);
    for($i = 1; $i < $len; $i  ){ 
        //獲取當前需要比較的元素值
        $tmp = $arr[$i];
        //內層循環,控制比較並插入
        for($j=$i -1;$j>=0;$j--){
            if($tmp < $arr[$j]){
                $arr[$j 1] = $arr[$j];
                $arr[$j] = $tmp;
            }else{
                break;
            }
        }
    }
    return $arr;
}

// 可以對傳統的插入排序算法進行改進,在查找插入位置時使用二分查找的方式。
function insertSort2($arr) {
    for ($i = 1; $i < count($arr); $i  ) {
        $key = $arr[$i];
        $left = 0;
        $right = $i - 1;
        while ($left <= $right) {
            // ceil() - 進一法取整
            // round() - 對浮點數進行四捨五入
            // floor() -返回不大於 value 的最接近的整數
            $middle = floor(($left   $right) / 2);  
            if ($key < $arr[$middle]) {
                $right = $middle - 1;
            } else {
                $left = $middle   1;
            }
        } 
        for ($j=$i-1; $j>= $left; $j--) {
            $arr[$j   1] = $arr[$j];
        }
        $arr[$left] = $key;
    }
    return $arr;
}

$arr = array(34, 55, 23, 34, 67);
echo "排序前: ";
foreach ($arr as $k => $val)
{
    echo $val.' ';
}
echo "<br>排序後 : ";
$arr = insertSort($arr);
foreach ($arr as $k => $val)
{
    echo $val.' ';
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章