1. 程式人生 > >修煉內功---資料結構與演算法9---插入排序

修煉內功---資料結構與演算法9---插入排序

插入排序的原理
我們將陣列中的資料分為兩個區間,已排序區間和未排序區間。
初始已排序區間只有一個元素,就是陣列的第一個元素。
插入演算法的核心思想是取未排序區間中的元素,在已排序區間中找到合適的插入位置將其插入,並保證已排序區間資料一直有序。
重複這個過程,直到未排序區間中元素為空,演算法結束。
<?php

/**
 * 插入排序實現函式(PHP)從小到大
 * @param $nums
 * @return mixed
 */
function insertion_sort($nums)
{
    if (count($nums) <= 1) {
        return $nums;
    }

    for ($i = 0; $i < count($nums); $i++) {

        //$value為未排序陣列的第一個,即即將插入到有序陣列中的值
        $value = $nums[$i];

        //$j有序陣列的長度
        for ($j = $i - 1; $j >= 0; $j--) {
            if ($nums[$j] > $value) {
                $nums[$j + 1] = $nums[$j];
            } else {
                break;
            }
        }

        $nums[$j + 1] = $value;
    }


    return $nums;
}

$nums = [5, 4, 6, 3, 2, 1];
$nums = insertion_sort($nums);
print_r($nums);

插入排序需要兩個巢狀的迴圈,時間複雜度是O(n^2)
沒有額外的儲存空間,是原地排序演算法;
不涉及相等元素位置交換,是穩定的排序演算法。

插入排序的時間複雜度和氣泡排序一樣,也不是很理想,
但是插入排序不涉及資料交換,從更細粒度來區分,效能要略優於氣泡排序。