[关闭]
@Chiang 2020-03-04T11:20:21.000000Z 字数 1196 阅读 782

插入排序

算法 2020-03


思路分析

每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。(从而得到一个新的、个数加一的有序数据)

描述

  • 从第一个元素开始,该元素可以认为已经被排序
  • 取出下一个元素,在已经排序的元素序列中从后向前扫描
  • 如果该元素(已排序)大于新元素,将该元素移到下一位置
  • 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  • 将新元素插入到下一位置中
  • 重复步骤 2~5

插入排序

代码实现

此处提供两种写法,主要是循环的写法稍有不同,可作参考.

  1. /*
  2. * 插入排序法
  3. * 每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
  4. * */
  5. function insertSort($arr){
  6. $len = count($arr);
  7. if ($len <= 1) {return $arr;}
  8. //先默认$array[0],已经有序,是有序表
  9. for($i = 1;$i < $len;$i++){
  10. if ($arr[$i] < $arr[$i-1]){
  11. $insertVal = $arr[$i]; //$insertVal是准备插入的数
  12. $insertIndex = $i - 1; //有序表中准备比较的数的下标
  13. while($insertIndex >= 0 && $insertVal < $arr[$insertIndex]){
  14. $arr[$insertIndex + 1] = $arr[$insertIndex]; //将数组往后挪
  15. $insertIndex--; //将下标往前挪,准备与前一个进行比较
  16. }
  17. if($insertIndex + 1 !== $i){
  18. $arr[$insertIndex + 1] = $insertVal;
  19. }
  20. }
  21. }
  22. return $arr;
  23. }
  24. function insertSort2($arr){
  25. $len = count($arr);
  26. if ($len <= 1) {return $arr;}
  27. //先默认$array[0],已经有序,是有序表
  28. for($i = 1;$i < $len;$i++){
  29. if ($arr[$i] < $arr[$i-1]){
  30. $insertVal = $arr[$i]; //$insertVal是准备插入的数
  31. //$j 有序表中准备比较的数的下标
  32. //$j-- 将下标往前挪,准备与前一个进行比较
  33. for ($j = $i-1;$j >= 0 && $insertVal < $arr[$j];$j--){
  34. $arr[$j+1]= $arr[$j];//将数组往后挪
  35. }
  36. $arr[$j + 1] = $insertVal;
  37. }
  38. }
  39. return $arr;
  40. }

小结

  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1) (用于记录需要插入的数据)
  • 稳定的排序方法
  • 算法适用于少量数据的排序
  • 如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。该算法可以认为是插入排序的一个变种,称为二分查找排序。

参考资料:
PHP常见排序算法学习

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注