插入排序 Insert Sort

● 插入排序的思想:

将一个待排序的无序的数组看作是两个列表,一个有序的列表,一个无序的列表,从无序的列表每次拿出一个待插入的元素,插入到有序的列表中,直到无序列表为空,排序完毕

● 实际举例:

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. 完整代码如下:

<?phpclass 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));

更多相关文章

  1. 格式化聊天列表时间
  2. php实现获取数组中相同/不相同的元素
  3. 为什么推荐使用for-each而不是for循环遍历元素?
  4. JVM 故障处理工具列表
  5. Map集合、散列表、红黑树介绍
  6. Selenium3自动化测试【12】元素定位认知
  7. 最近 5 年 133 个 Java 面试问题列表(上)
  8. 最近 5 年 133 个 Java 面试问题列表(下)
  9. Jquery对选取到的元素显示指定的长度,对于的字符串用“...”显示

随机推荐

  1. HTML中图片的截取一部分显示
  2. 问一个高深的问题,静态html页面如何接收来
  3. KeyPress或KeyDown事件没有得到html元素
  4. 在h:inputTextarea中阻止Html标记
  5. jquery入门-$.each 数组操作与表单操作代
  6. 穹顶之下-善恶是非谁来负责
  7. HTML设置的横跨3列
  8. .fadeToggle()使我的子列表不可访问
  9. 如果字符串包含html代码,如何用python检测
  10. 去除Chrome浏览器文本框边缘的黄线