● 插进去排序的头脑:
将一个待排序的无序的数组看做是两个列表,一个有序的列表,一个无序的列表,从无序的列表每次拿出一个待插进去的元素,插进去到有序的列表中,直到无序列表为空,排序终了
● 现实举例:
1. 有一个无序的一维数组是此次须要排序的数组,数组是:[36,12,96,-1]
2. 起首把数组的第一个元素 [36] 看做是一个自力的有序的列表,把剩下的元素 [12, 96, -1] 看做是一个无序的列表
3. 第一个待插进去的元素就是 12,要把 12 插进去到有序的列表中,起首须要 12 和 36 比较,假如带插进去的元素 12 小于 36, 就须要把 12 插进去到 36前面,也就是 36 要后移一名。
4. 插进去排序现实是须要比较数组元素的总数减一轮,由于第一个元素不须要比较。
$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;//把插进去的元素插进去到有序列表的第一个位置或者是没发生交流就在自身的位置
顺次类推,获得完成的有序数组
5. 完全代码以下:
<?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 排序算法之插进去排序的细致内容,更多请关注ki4网别的相干文章!