1. 程式人生 > >插入排序——直接插入排序(StraightInsertionSort)

插入排序——直接插入排序(StraightInsertionSort)

原理

從第一個元素開始,該元素可以認為已經被排序
取出下一個元素,在已經排序的元素序列中從後向前掃描
如果該元素(已排序)大於新元素,將該元素移到下一位置
重複步驟3,直到找到已排序的元素小於或者等於新元素的位置
將新元素插入到該位置後
重複步驟2~5

<?php
/**
 * 直接插入排序
 * 資料結構----------------陣列
 * 最差時間複雜度-----------O(n^2):輸入序列是降序排列的
 * 最優時間複雜度-----------O(n):輸入序列是升序排列的
 * 平均時間複雜度-----------O(n^2)
 * 空間複雜度--------------O(1)
 * 穩定性-----------------穩定
 */
 
$arr = [1, 3, 34, 2, 32, 2, 78, -43, 53, -35, 0];
 
function StraightInsertionSort($arr)
{						     // 陣列第一個元素預設已被排序
	for ($i = 1; $i < count($arr); $i++) {	      // 未排序序列從陣列第二個元素開始
		$get = $arr[$i];		       // 獲取未排列序列第一個元素為要比較的元素
		$j = $i - 1;				// 指標指向已排序序列最後一個元素
		while ($j >= 0 && $arr[$j] > $get) {  // 當指標指向的元素比要比較的元素大
			$arr[$j + 1] = $arr[$j];	// 則將指標指向的元素向後移動一位
			$j--;				// 指標前移
		}
		$arr[$j + 1] = $get;			// 直到指標指向的元素與要比較元素小或者相等,則要比較元素插入到指標指向元素後
	}
	return $arr;
}
 
print_r(StraightInsertionSort($arr));