挿入ソート
● 挿入ソートの考え方:
順序のない配列を 2 つのリストとしてソートすると考えます。1 つは順番に、1 つはリスト、もう 1 つはリストです。順序なしリストでは、順序なしリストから挿入する要素を 1 つずつ取り出し、順序なしリストが空になり並べ替えが完了するまで順序付きリストに挿入します。
#● 実際の例: 1. 今回ソートする必要がある順序なしの 1 次元配列があります。配列は [36,12,96,-1]2 です。まず、最初の要素 [ 36] は独立した順序付きリストとみなされ、残りの要素 [12, 96, -1] は順序なしリストとみなされます3. 最初に挿入される要素は 12 です。順序付きリストの場合、まず 12 と 36 を比較する必要があります。挿入された要素 12 が 36 より小さい場合は、36 の前に 12 を挿入する必要があります。つまり、36 を 1 ビット後ろに移動する必要があります。 4. 最初の要素を比較する必要がないため、挿入ソートでは実際には配列要素の総数から 1 ラウンドを引いたものを比較する必要があります。$arr = [36,12,96,-1]; //待插入的数 $insertValue = $arr[1]; //待插入数前面的数的索引 $insertIndek = 1 - 1; //$insertIndek >= 0 保证插入循环时,不越界,保证第一个元素的下标要大于等0 //$insertValue < $arr[$insertIndek] 保证待插入的数还没有找到插入的位置,即待插入的数是小于它前面的那一个元素的 //符合上述条件的,需要将$arr[$insertIndek] 后移 while($insertIndek >= 0 && $insertValue < $arr[$insertIndek]) { $arr[$insertIndek+1] = $arr[$insertIndek]; $insertIndek--; //代表的就是有序列表的最前面一个元素的前面一个下标 -1; } //当退出循环时,代表找到位置 $insertIndek + 1 $arr[$insertIndek + 1] = $insertValue; //把插入的元素插入到有序列表的第一个位置或者是没发生交换就在本身的位置 $arr = [12,36,96,-1]; //待插入的数 $insertValue = $arr[2]; //待插入数前面的数的索引 $insertIndek = 2 - 1; //$insertIndek >= 0 保证插入循环时,不越界,保证第一个元素的下标要大于等0 //$insertValue < $arr[$insertIndek] 保证待插入的数还没有找到插入的位置,即待插入的数是小于它前面的那一个元素的 //符合上述条件的,需要将$arr[$insertIndek] 后移 while($insertIndek >= 0 && $insertValue < $arr[$insertIndek]) { $arr[$insertIndek+1] = $arr[$insertIndek]; $insertIndek--; //代表的就是有序列表的最前面一个元素的前面一个下标 -1; } //当退出循环时,代表找到位置 $insertIndek + 1 $arr[$insertIndek + 1] = $insertValue;//把插入的元素插入到有序列表的第一个位置或者是没发生交换就在本身的位置
<?php class InsertSort { public static function insertArraySort(array $data):array { if (!is_array($data)) { return ['message' => '待排序的序列非数组']; } $count = count($data); if ($count <= 1) { return $data; } for ($i = 1; $i < $count; $i++) { //待插入的元素 $insertValue = $data[$i]; //待插入数前面的数的索引 $insertIndek = $i - 1; //$insertIndek >= 0 保证插入循环时,不越界,保证第一个元素的下标要大于等0\ //$insertValue < $arr[$insertIndek] 保证待插入的数还没有找到插入的位置,即待插入的数是小于它前面的那一个元素的 //符合上述条件的,需要将$arr[$insertIndek] 后移 while($insertIndek >= 0 && $insertValue < $data[$insertIndek]) { $data[$insertIndek+1] = $data[$insertIndek]; $insertIndek--;//代表的就是有序列表的最前面一个元素的前面一个下标 -1; } //当退出循环时,代表找到位置 $insertIndek + 1 //把插入的元素插入到有序列表的第一个位置 //或者是没发生交换,即待插入元素大于有序列表的最后一个元素,那么这里只需要将有序列表的最后一个元素的索引 + 1,把待插入元素放在后 //面一位即可 $data[$insertIndek + 1] = $insertValue;\ } return $data; } } $arr = [36,12,96,-1]; var_dump(InsertSort::insertArraySort($arr));
以上がPHPソートアルゴリズム挿入ソートの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。