zoukankan      html  css  js  c++  java
  • 排序算法之插入排序

      插入排序一般分为直接插入排序和二分插入插入排序。

      直接插入排序又可以分为前插和后插,不过虽然是这样分,只是寻找地点的方向不一样而已。“前插”就是从头开始找合适的位置,“后插”就是从后面开始找合适的位置。这里我们只讨论“后插”。直接插入排序的思想很简单,开始时,整个数组都是无序的,默认第一个数是排好序的,然后要把第二个数插入到前面,那么就要找到合适的位置插入,从当前数的前一个数$a与当前数$s进行比较,如果此时$a<$s,那么就把$s插入到$a的后面,否则$s就与$a前面的数$b进行比较,或者$a已经是第一个数了就停止,把$s插入到数组的第一个位置。现在前两个数已经是有序的了, 然后就是插入第三个数,步骤是一样的。一个关键性的问题就是,循环停止的位置是要插入的位置的前一个,也就是说,应该从这个位置的后一个向后移动,腾出那个合适的位置。腾位置时应该是前一个数覆盖后一个数,所有for循环应该从后向前开始。

     1 <?php
     2     function insertSort(&$a){
     3         $t = count($a);
     4         for($i=1; $i<$t; $i++){
     5             $j = $i-1;
     6             while($j>=0){
     7                 if($a[$j] < $a[$i]){
     8                     break;
     9                 }else{
    10                     $j--;
    11                 }
    12             }
    13             //保存当前数据
    14                     $s = $a[$i];
    15             //将数据向后移动
    16             for($k=$i; $k>$j+1; $k--){
    17                 $a[$k] = $a[$k-1];
    18             }
    19             //将当前的数据放在找到的位置
    20             $a[$j+1] = $s;21         }
    22     }
    23 ?>

      还有就是二分插入排序,二分插入排序只不过查找的方式不同而已。每次要插入的值$a[$i]总是与前面已排好序的中间的值$a[$mid]进行比较,如果$a[$i]比较小则在前面的区间继续二分查找,否则在后面的区间。

     1 <?php
     2     function binarySort(&$a){
     3         $t = count($a);
     4             
     5         for($i=1; $i<$t; $i++){
     6             $left = 0;
     7             $right = $i;
     8             while($left <= $right){
     9                 $mid = intval(($left+$right)/2);
    10                 if($a[$mid] > $a[$i]){
    11                     $right = $mid-1;
    12                 }else if($a[$mid] < $a[$i]){
    13                     $left = $mid+1;
    14                 }else{
    15                     break;
    16                 }
    17             }
    18             //保存当前数据
    19             $s = $a[$i];
    20             //将数据向后移动
    21             for($k=$i; $k>=$left; $k--){
    22                 $a[$k] = $a[$k-1];
    23             }
    24             //将当前的数据放在找到的位置
    25             $a[$left] = $s;
    26         }
    27     }
    28 ?>

      插入排序也是一种简单的排序方式。

  • 相关阅读:
    Spring 框架学些(二)Spring AOP
    Spring框架学习(一)
    java spring框架的HelloWord
    Windows下查看进程执行参数
    js的code标签显示插件
    初接触hbase数据库
    gpg加密使用
    .net core全球化配置、使用
    CSS添加本地字体
    2011年NOIP普及组复赛题解
  • 原文地址:https://www.cnblogs.com/xumengxuan/p/2797660.html
Copyright © 2011-2022 走看看